PERFORCE change 147078 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Aug 10 13:01:41 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=147078
Change 147078 by trasz at trasz_traszkan on 2008/08/10 13:01:20
Parse appended id. Note that it's not really compatible with
Sun's implementation - they tend to omit "flags" field; parsing
it in that form would be harder. Sun folks just use yacc parser.
Affected files ...
.. //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_from_text_nfs4.c#6 edit
Differences ...
==== //depot/projects/soc2008/trasz_nfs4acl/lib/libc/posix1e/acl_from_text_nfs4.c#6 (text+ko) ====
@@ -43,9 +43,15 @@
#define MAX_ENTRY_LENGTH 512
+/*
+ * Parse the tag field of ACL entry passed as "str". If qualifier
+ * needs to follow, then the variable referenced by "need_qualifier"
+ * is set to 1, otherwise it's set to 0.
+ */
static int
parse_tag(const char *str, acl_entry_t entry, int *need_qualifier)
{
+ assert(need_qualifier != NULL);
*need_qualifier = 0;
if (strcmp(str, "owner@") == 0)
@@ -70,8 +76,13 @@
return (-1);
}
+/*
+ * Parse the qualifier field of ACL entry passed as "str".
+ * If user or group name cannot be resolved, then the variable
+ * referenced by "need_qualifier" is set to 1.
+ */
static int
-parse_qualifier(char *str, acl_entry_t entry)
+parse_qualifier(char *str, acl_entry_t entry, int *need_qualifier)
{
int qualifier_length, error;
id_t id;
@@ -80,6 +91,9 @@
struct group *grp;
acl_tag_t tag;
+ assert(need_qualifier != NULL);
+ *need_qualifier = 0;
+
qualifier_length = strlen(str);
if (qualifier_length == 0) {
@@ -110,8 +124,8 @@
/* XXX: Thread-unsafe. */
pwd = getpwnam(str);
if (pwd == NULL) {
- warnx("malformed ACL: unknown user \"%s\"", str);
- return (-1);
+ *need_qualifier = 1;
+ return (0);
}
return (acl_set_qualifier(entry, &(pwd->pw_uid)));
@@ -120,8 +134,8 @@
/* XXX: Thread-unsafe. */
grp = getgrnam(str);
if (grp == NULL) {
- warnx("malformed ACL: unknown group \"%s\"", str);
- return (-1);
+ *need_qualifier = 1;
+ return (0);
}
return (acl_set_qualifier(entry, &(grp->gr_gid)));
@@ -176,6 +190,29 @@
}
static int
+parse_appended_id(char *str, acl_entry_t entry)
+{
+ int qualifier_length;
+ char *end;
+ id_t id;
+
+ qualifier_length = strlen(str);
+ if (qualifier_length == 0) {
+ warnx("malformed ACL: \"appended id\" field present, "
+ "but empty");
+ return (-1);
+ }
+
+ id = strtod(str, &end);
+ if (end - str != qualifier_length) {
+ warnx("malformed ACL: appended id is not a number");
+ return (-1);
+ }
+
+ return (acl_set_qualifier(entry, &id));
+}
+
+static int
number_of_colons(const char *str)
{
int count = 0;
@@ -195,7 +232,7 @@
{
int error, need_qualifier;
acl_entry_t entry;
- char *field;
+ char *field, *qualifier_field;
error = acl_create_entry(&aclp, &entry);
if (error)
@@ -223,8 +260,8 @@
if (need_qualifier) {
if (str == NULL)
goto truncated_entry;
- field = strsep(&str, ":");
- error = parse_qualifier(field, entry);
+ qualifier_field = field = strsep(&str, ":");
+ error = parse_qualifier(field, entry, &need_qualifier);
if (error)
goto malformed_field;
}
@@ -248,10 +285,23 @@
if (str == NULL)
goto truncated_entry;
- error = parse_extended(str, entry);
+ field = strsep(&str, ":");
+ error = parse_extended(field, entry);
if (error)
goto malformed_field;
+ if (need_qualifier) {
+ if (str == NULL) {
+ warnx("malformed ACL: unknown user or group name "
+ "\"%s\"", qualifier_field);
+ goto truncated_entry;
+ }
+
+ error = parse_appended_id(str, entry);
+ if (error)
+ goto malformed_field;
+ }
+
return (0);
truncated_entry:
More information about the p4-projects
mailing list