diff options
Diffstat (limited to 'lib/libposix1e/acl_support.c')
-rw-r--r-- | lib/libposix1e/acl_support.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/lib/libposix1e/acl_support.c b/lib/libposix1e/acl_support.c index f2e83b7..012d106 100644 --- a/lib/libposix1e/acl_support.c +++ b/lib/libposix1e/acl_support.c @@ -289,22 +289,34 @@ acl_name_to_id(acl_tag_t tag, char *name, uid_t *id) { struct group *g; struct passwd *p; + unsigned long l; + char *endp; switch(tag) { case ACL_USER: p = getpwnam(name); - if (!p) { - errno = EINVAL; - return (-1); + if (p == NULL) { + l = strtoul(name, &endp, 0); + if (*endp != '\0' || l != (unsigned long)(uid_t)l) { + errno = EINVAL; + return (-1); + } + *id = (uid_t)l; + return (0); } *id = p->pw_uid; return (0); case ACL_GROUP: g = getgrnam(name); - if (!g) { - errno = EINVAL; - return (-1); + if (g == NULL) { + l = strtoul(name, &endp, 0); + if (*endp != '\0' || l != (unsigned long)(gid_t)l) { + errno = EINVAL; + return (-1); + } + *id = (gid_t)l; + return (0); } *id = g->gr_gid; return (0); |