Sfoglia il codice sorgente

(decode_options): Don't pass names longer than UNAME_FIELD_SIZE to
uname_to_uid, as it messes up the cache. Similarly for gname_to_uid.

Paul Eggert 26 anni fa
parent
commit
562d543b2d
1 ha cambiato i file con 12 aggiunte e 8 eliminazioni
  1. 12 8
      src/tar.c

+ 12 - 8
src/tar.c

@@ -1,5 +1,5 @@
 /* A tar (tape archiver) program.
-   Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
+   Copyright (C) 1988, 92,93,94,95,96,97, 1999 Free Software Foundation, Inc.
    Written by John Gilmore, starting 1985-08-25.
 
    This program is free software; you can redistribute it and/or modify it
@@ -537,11 +537,13 @@ decode_options (int argc, char *const *argv)
 	  *out++ = xstrdup (buffer);
 	  cursor = strchr (OPTION_STRING, *letter);
 	  if (cursor && cursor[1] == ':')
-	    if (in < argv + argc)
-	      *out++ = *in++;
-	    else
-	      USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
-			    *letter));
+	    {
+	      if (in < argv + argc)
+		*out++ = *in++;
+	      else
+		USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
+			      *letter));
+	    }
 	}
 
       /* Copy all remaining options.  */
@@ -850,7 +852,8 @@ decode_options (int argc, char *const *argv)
 	break;
 
       case GROUP_OPTION:
-	if (!gname_to_gid (optarg, &group_option))
+	if (! (strlen (optarg) < GNAME_FIELD_SIZE
+	       && gname_to_gid (optarg, &group_option)))
 	  {
 	    uintmax_t g;
 	    if (!check_decimal (optarg, &g) || g != (gid_t) g)
@@ -879,7 +882,8 @@ decode_options (int argc, char *const *argv)
 	break;
 
       case OWNER_OPTION:
-	if (!uname_to_uid (optarg, &owner_option))
+	if (! (strlen (optarg) < UNAME_FIELD_SIZE
+	       && uname_to_uid (optarg, &owner_option)))
 	  {
 	    uintmax_t u;
 	    if (!check_decimal (optarg, &u) || u != (uid_t) u)