(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.
This commit is contained in:
20
src/tar.c
20
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)
|
||||
|
||||
Reference in New Issue
Block a user