svn commit: r277652 - in head/usr.sbin/pw: . tests
Robert Watson
rwatson at FreeBSD.org
Tue Jan 27 23:31:29 UTC 2015
On Sun, 25 Jan 2015, Bruce Evans wrote:
> Negative ids have historical abuses in places like mountd. mountd still
> hard-codes -2 and -2 for the default uid and gid of an unprivileged user. It
> at least casts these values to uid_t and gid_t before using them. This gives
> the ids the non-random values of UINT32_MAX-1 if uid_t and gid_t are
> uint32_t. (If uid_t and gid_t were signed, then it would leave the values
> as negative, so invalid.) These magic values may work better than when ids
> were 16 bits, since there is less risk of them conflicting with a normal id.
> However, the non-conflict is probably a bug. FreeBSD uses the magic ids of
> 65534 for user nobody: group nobody. These would have been (id_t)-2 with
> 16-bit ids. They no longer match, so ls displays (id_t)-2 numerically.
> FreeBSD also has a group nogroup = 65553 that doesn't match the nfs usage.
> However2, in FreeBSD-1 wher ids were 16-bits, nobody was 32767 and nogroup
> was 32766. so they didn't match nfs for other reasons. The 2 non-groups now
> seem to be just a bug -- FreeBSD-1 didn't have group nobody. 4.4BSD-Lite2
> has the same values as FreeBSD-1.
I'm sure it goes without saying, but for those that don't know (i.e., some
subset of people who are not Bruce):
(-1) has a defined value both for our system-call interface (chown(2),
fchown(2), etc, use (-1) to indicate that no change is requested).
This is also used inside the kernel to similar end, where VNOVAL also takes on
a value of (-1).
This problem also used to exist in NFS, where in NFSv2, (-1) was also used to
indicate which fields not to update, but this was fixed in NFSv3 by
introducing discriminated unions.
I personally find myself a fan of fixing (eliminating) VNOVAL, but in the end
it would likely just be disruptive and confusing.
Robert
More information about the svn-src-all
mailing list