On 11/15/2011 09:59 AM, Paul Eggert wrote:
> On 11/15/11 05:07, Ludovic Courtès wrote:
> 
>> On GNU/Hurd, no error would ever be raised (since uid_t is unsigned),
> 
> Ouch.  Thanks, now I understand Roland's suggestion.
> How about this patch instead?

>    else
>      {
> +      /* POSIX says getuid etc. cannot fail, but they can fail under
> +         GNU/Hurd and a few other systems.  Test for failure by
> +         checking errno.  */
> +      uid_t NO_UID = -1;
> +      gid_t NO_GID = -1;
> +
> +      errno = 0;
>        euid = geteuid ();
> -      if (GETID_MAY_FAIL && euid == -1 && !use_real
> +      if (euid == NO_UID && errno && !use_real
>            && !just_group && !just_group_list && !just_context)
>          error (EXIT_FAILURE, errno, _("cannot get effective UID"));
> 

Still debatable.  POSIX explicitly states that the condition of errno
after a successful call to a standardized function is unspecified; that
is, a successful geteuid() may pollute errno, but it's okay, because the
user shouldn't be inspecting errno after geteuid().

It might be worth proposing a change to POSIX to require that geteuid()
and friends leave errno unchanged on success (in order to allow for the
GNU extension of setting errno on failure, even though POSIX did not
reserve a specific value for failure); I'll pursue that course.

But I like this version better than any previous one about trying to
reject result < 0.

-- 
Eric Blake   ebl...@redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to