While uid_t and gid_t are both unsigned, the values (uid_t) -1 and (gid_t) -1 are reserved. A uid or gid argument of -1 to the chown(2) system call means to leave the uid/gid unchanged. Catch this case so that trying to set a uid or gid to -1 will result in an error. Test cases: chown 4294967295 file chown :4294967295 file chgrp 4294967295 file Andreas Gruenbacher Index: coreutils-5.2.1/lib/userspec.c ================================================================================ --- coreutils-6.9-316-e6f4b/lib/userspec.c +++ coreutils-6.9-316-e6f4b/lib/userspec.c @@ -169,7 +169,7 @@ parse_with_separator (char const *spec, { unsigned long int tmp; if (xstrtoul (u, NULL, 10, &tmp, "") == LONGINT_OK - && tmp <= MAXUID) + && tmp <= MAXUID && tmp != (uid_t) -1) unum = tmp; else error_msg = E_invalid_user; @@ -200,7 +200,8 @@ parse_with_separator (char const *spec, if (grp == NULL) { unsigned long int tmp; - if (xstrtoul (g, NULL, 10, &tmp, "") == LONGINT_OK && tmp <= MAXGID) + if (xstrtoul (g, NULL, 10, &tmp, "") == LONGINT_OK && tmp <= MAXGID + && tmp != (gid_t) -1) gnum = tmp; else error_msg = E_invalid_group; --- coreutils-6.9-316-e6f4b/src/chgrp.c +++ coreutils-6.9-316-e6f4b/src/chgrp.c @@ -90,7 +90,7 @@ parse_group (const char *name) { unsigned long int tmp; if (! (xstrtoul (name, NULL, 10, &tmp, "") == LONGINT_OK - && tmp <= GID_T_MAX)) + && tmp <= GID_T_MAX && tmp != (gid_t) -1)) error (EXIT_FAILURE, 0, _("invalid group: %s"), quote (name)); gid = tmp; }