Search code examples
cuid

Is the uid_t type signed or unsigned?


I know that the standard doesn't say anything about the signedness of uid_t or gid_t.

Inconsistency:

Page http://www.gnu.org/software/libc/manual/html_node/Reading-Persona.html says:

In the GNU C Library, this is an alias for unsigned int.

But man setreuid says:

Supplying a value of -1 for either the real or effective user ID forces the system to leave that ID unchanged.

Questions:

  1. So, is uid_t signed or unsigned in the GNU Library?

  2. How can I supply -1 if uid_t and gid_t are unsigned (-1 will be converted to 0xFFFFFFFF)?


Solution

  • uid_t is (after some typedefs/defines) defined as __U32_TYPE which is defined as unsigned int (that is on my Gentoo Linux system).

    However, just because -1 has a special meaning it does not mean that UIDs are restricted to the numbers that fit in a signed int. It just means that the highest value (i.e. (unsigned int)-1) is not a valid UID. The code in setreuid probably uses the reverse form of that cast ((signed int)ruid) to compare against -1 cleanly although it accepts an uid_t.