Sophie

Sophie

distrib > Fedora > 13 > i386 > media > updates-src > by-pkgid > 56669419e71578ed363610507e39dcd4 > files > 24

gridengine-6.2u5-5.fc13.src.rpm

/*
 * Place holder library to ensure prctl(PR_SET_DUMPABLE, 1) is done after
 * each setuid(), seteuid(), setgid(), and setegid()
 */
#include <sys/types.h>
#include <dlfcn.h>
#include <pthread.h>
#include <sys/prctl.h>

static pthread_once_t only_once = PTHREAD_ONCE_INIT;

static int (*setuid_func)(uid_t uid) = NULL;
static int (*seteuid_func)(uid_t uid) = NULL;
static int (*setgid_func)(gid_t gid) = NULL;
static int (*setegid_func)(gid_t gid) = NULL;

static void init_funcs(void)
{
    setuid_func = (int (*)(uid_t uid))dlsym(RTLD_NEXT,  "setuid");
   seteuid_func = (int (*)(uid_t uid))dlsym(RTLD_NEXT, "seteuid");
    setgid_func = (int (*)(gid_t uid))dlsym(RTLD_NEXT,  "setgid");
   setegid_func = (int (*)(gid_t uid))dlsym(RTLD_NEXT, "setegid");
}

#define WRAP(func, clib_func, t) \
int func(t uid) \
{ \
   pthread_once(&only_once, init_funcs); \
   int ret = clib_func(uid); \
   prctl(PR_SET_DUMPABLE, 1, 42, 42, 42); \
   return ret; \
}

WRAP(setuid,  setuid_func,  uid_t)
WRAP(seteuid, seteuid_func, uid_t)
WRAP(setgid,  setgid_func,  gid_t)
WRAP(setegid, setegid_func, gid_t)