* lib/userspec.c (parse_with_separator): If a user or group string
authorJim Meyering <jim@meyering.net>
Sat, 20 Jan 2007 08:46:44 +0000 (08:46 +0000)
committerJim Meyering <jim@meyering.net>
Sat, 20 Jan 2007 08:46:44 +0000 (08:46 +0000)
starts with "+", skip the corresponding name-to-ID look-up, since
such a look-up must fail: user and group names may not include "+".

ChangeLog
lib/userspec.c

index f0bae7e..108f289 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-01-20  Jim Meyering  <jim@meyering.net>
+
+       * lib/userspec.c (parse_with_separator): If a user or group string
+       starts with "+", skip the corresponding name-to-ID look-up, since
+       such a look-up must fail: user and group names may not include "+".
+
 2007-01-19  Paul Eggert  <eggert@cs.ucla.edu>
 
        * lib/poll.c: Include sys/time.h and time.h unconditionally,
index 4dbaee0..5f4f2af 100644 (file)
@@ -1,5 +1,5 @@
 /* userspec.c -- Parse a user and group string.
-   Copyright (C) 1989-1992, 1997-1998, 2000, 2002-2006 Free Software
+   Copyright (C) 1989-1992, 1997-1998, 2000, 2002-2007 Free Software
    Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
@@ -156,7 +156,8 @@ parse_with_separator (char const *spec, char const *separator,
 
   if (u != NULL)
     {
-      pwd = getpwnam (u);
+      /* If it starts with "+", skip the look-up.  */
+      pwd = (*u == '+' ? NULL : getpwnam (u));
       if (pwd == NULL)
        {
          bool use_login_group = (separator != NULL && g == NULL);
@@ -196,7 +197,8 @@ parse_with_separator (char const *spec, char const *separator,
   if (g != NULL && error_msg == NULL)
     {
       /* Explicit group.  */
-      grp = getgrnam (g);
+      /* If it starts with "+", skip the look-up.  */
+      grp = (*g == '+' ? NULL : getgrnam (g));
       if (grp == NULL)
        {
          unsigned long int tmp;