delorie.com/archives/browse.cgi | search |
At 06:42 PM 1/22/2003 +0100, Corinna Vinschen wrote: Back to earth and to the original thread... >Your code: > > if (rgid != -1) > ERROR; > return setegid (egid); > >My tiny extension: > > if (rgid != -1) > if (rgid == egid) > return setuid (rgid); > ERROR; > return setegid (egid); I think the following is a full implementation. Cygwin doesn't really care about the real uid, it's just bookkeeping. However there is a posix requirement that setuid(ruid) must succeed, the hard part of which would be to change the effective uid. The only way to know is to do a dry run, that's the first seteuid32 below. The second one is for real. The third is to back out of the dry run if needed. Ditto for gid. Neither compiled nor tested. Pierre extern "C" int setreuid32 (__uid32_t ruid, __uid32_t euid) { int ret = 0; bool tried; __uid32_t old_euid = myself->uid; if ((tried = ruid != ILLEGAL_UID && cygheap->user.real_uid != ruid && euid != ruid)) ret = seteuid32 (ruid); if (!ret && euid != ILLEGAL_UID) ret = seteuid32 (euid); if (tried && (ret || euid == ILLEGAL_UID) && seteuid32 (old_euid)) system_printf ("Cannot restore original euid %u\n", old_euid); if (!ret && ruid != ILLEGAL_UID) cygheap->user.real_uid = ruid; debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid); return ret; }
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |