From owner-p4-projects@FreeBSD.ORG Sun Aug 10 13:01:41 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 61E0D1065672; Sun, 10 Aug 2008 13:01:41 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0D563106566C for ; Sun, 10 Aug 2008 13:01:41 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 02D6E8FC18 for ; Sun, 10 Aug 2008 13:01:41 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m7AD1e5Z001218 for ; Sun, 10 Aug 2008 13:01:40 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m7AD1eZ8001216 for perforce@freebsd.org; Sun, 10 Aug 2008 13:01:40 GMT (envelope-from trasz@freebsd.org) Date: Sun, 10 Aug 2008 13:01:40 GMT Message-Id: <200808101301.m7AD1eZ8001216@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Cc: Subject: PERFORCE change 147078 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 Aug 2008 13:01:41 -0000 http://perforce.freebsd.org/chv.cgi?CH=147078 Change 147078 by trasz@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: