This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [ITP] libfakesu 1.0


D. Boland wrote:
Hi Christian,

Christian Franke wrote:
...
BTW: All these variables except root_uid/gid are not needed as static
globals:

my_uid is only used to pass the uid from uid_get/set() to get/set(e)uid().

my_pw and str255 are only needed because su_getpwnam() calls
getpwnam_r() instead of getpwnam().
I did that to avoid writing into 'external' memory. Would calling getpwnam directly
be thread-safe?

No and this cannot be fixed because the function interface itself uses on a static pwd buffer as return value (and TLS is not allowed). As a consequence, the su_getpwnam() is also not thread safe. Calling thread-safe su_getpwnam_r() with a static result buffer makes the result thread-unsafe.

This would work without any extra buffers and is as thread-unsafe as the current version:

struct passwd *su_getpwnam(const char *name)
{
    struct passwd *pwd = getpwnam(name);
    if (!pwd)
        return NULL;
    if (pwd->pw_uid == root_uid)
        pwd->pw_uid = 0;
    if (pwd->pw_gid == root_gid)
        pwd->pw_gid = 0;
    return pwd;
}


Christian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]