diff --git a/lib/uid_wrapper/uid_wrapper.c b/lib/uid_wrapper/uid_wrapper.c index efc4407c7e2..cb7db5f5ccb 100644 --- a/lib/uid_wrapper/uid_wrapper.c +++ b/lib/uid_wrapper/uid_wrapper.c @@ -189,6 +189,9 @@ struct uwrap_libc_fns { #endif #ifdef HAVE_SETRESUID int (*_libc_setresuid)(uid_t ruid, uid_t euid, uid_t suid); +#endif +#ifdef HAVE_GETRESUID + int (*_libc_getresuid)(uid_t *ruid, uid_t *euid, uid_t *suid); #endif uid_t (*_libc_geteuid)(void); @@ -202,6 +205,9 @@ struct uwrap_libc_fns { #endif #ifdef HAVE_SETRESGID int (*_libc_setresgid)(uid_t rgid, uid_t egid, uid_t sgid); +#endif +#ifdef HAVE_GETRESGID + int (*_libc_getresgid)(gid_t *rgid, gid_t *egid, gid_t *sgid); #endif gid_t (*_libc_getegid)(void); int (*_libc_getgroups)(int size, gid_t list[]); @@ -413,6 +419,15 @@ static int libc_setresuid(uid_t ruid, uid_t euid, uid_t suid) } #endif +#ifdef HAVE_GETRESUID +static int libc_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) +{ + uwrap_load_lib_function(UWRAP_LIBC, getresuid); + + return uwrap.libc.fns._libc_getresuid(ruid, euid, suid); +} +#endif + static uid_t libc_geteuid(void) { uwrap_load_lib_function(UWRAP_LIBC, geteuid); @@ -461,6 +476,15 @@ static int libc_setresgid(gid_t rgid, gid_t egid, gid_t sgid) } #endif +#ifdef HAVE_GETRESGID +static int libc_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) +{ + uwrap_load_lib_function(UWRAP_LIBC, setresgid); + + return uwrap.libc.fns._libc_getresgid(rgid, egid, sgid); +} +#endif + static gid_t libc_getegid(void) { uwrap_load_lib_function(UWRAP_LIBC, getegid); @@ -720,6 +744,23 @@ bool uid_wrapper_enabled(void) return enabled; } +#ifdef HAVE_GETRESUID +static int uwrap_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) +{ + struct uwrap_thread *id = uwrap_tls_id; + + UWRAP_LOCK(uwrap_id); + + *ruid = id->ruid; + *euid = id->euid; + *suid = id->suid; + + UWRAP_UNLOCK(uwrap_id); + + return 0; +} +#endif + static int uwrap_setresuid_thread(uid_t ruid, uid_t euid, uid_t suid) { struct uwrap_thread *id = uwrap_tls_id; @@ -762,6 +803,23 @@ static int uwrap_setresuid_thread(uid_t ruid, uid_t euid, uid_t suid) return 0; } +#ifdef HAVE_GETRESGID +static int uwrap_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) +{ + struct uwrap_thread *id = uwrap_tls_id; + + UWRAP_LOCK(uwrap_id); + + *rgid = id->rgid; + *egid = id->egid; + *sgid = id->sgid; + + UWRAP_UNLOCK(uwrap_id); + + return 0; +} +#endif + static int uwrap_setresuid(uid_t ruid, uid_t euid, uid_t suid) { struct uwrap_thread *id; @@ -867,6 +925,18 @@ int setresuid(uid_t ruid, uid_t euid, uid_t suid) } #endif +#ifdef HAVE_GETRESUID +int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) +{ + if (!uid_wrapper_enabled()) { + return libc_getresuid(ruid, euid, suid); + } + + uwrap_init(); + return uwrap_getresuid(ruid, euid, suid); +} +#endif + /* * GETUID */ @@ -1057,6 +1127,18 @@ int setresgid(gid_t rgid, gid_t egid, gid_t sgid) } #endif +#ifdef HAVE_GETRESGID +int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) +{ + if (!uid_wrapper_enabled()) { + return libc_getresgid(rgid, egid, sgid); + } + + uwrap_init(); + return uwrap_getresgid(rgid, egid, sgid); +} +#endif + /* * GETGID */ @@ -1315,6 +1397,20 @@ static long int uwrap_syscall (long int sysno, va_list vp) } break; #endif /* SYS_setresgid */ +#ifdef SYS_getresgid + case SYS_getresgid: +#ifdef HAVE_LINUX_32BIT_SYSCALLS + case SYS_getresgid32: +#endif + { + gid_t *rgid = (gid_t *) va_arg(vp, gid_t *); + gid_t *egid = (gid_t *) va_arg(vp, gid_t *); + gid_t *sgid = (gid_t *) va_arg(vp, gid_t *); + + rc = uwrap_getresgid(rgid, egid, sgid); + } + break; +#endif /* SYS_getresgid */ /* uid */ case SYS_getuid: @@ -1370,7 +1466,20 @@ static long int uwrap_syscall (long int sysno, va_list vp) } break; #endif /* SYS_setresuid */ +#ifdef SYS_getresuid + case SYS_getresuid: +#ifdef HAVE_LINUX_32BIT_SYSCALLS + case SYS_getresuid32: +#endif + { + uid_t *ruid = (uid_t *) va_arg(vp, uid_t *); + uid_t *euid = (uid_t *) va_arg(vp, uid_t *); + uid_t *suid = (uid_t *) va_arg(vp, uid_t *); + rc = uwrap_getresuid(ruid, euid, suid); + } + break; +#endif /* SYS_getresuid */ /* groups */ case SYS_setgroups: #ifdef HAVE_LINUX_32BIT_SYSCALLS diff --git a/lib/uid_wrapper/wscript b/lib/uid_wrapper/wscript index 61b54b94f0d..efdcf11d98d 100644 --- a/lib/uid_wrapper/wscript +++ b/lib/uid_wrapper/wscript @@ -107,6 +107,8 @@ def configure(conf): 'int syscall(int number, ...)', define='HAVE_SYSCALL_INT', headers='unistd.h sys/syscall.h') + conf.CHECK_FUNCS('getresuid getresgid') + # Create full path to uid_wrapper srcdir = os.path.realpath(conf.srcdir) libuid_wrapper_so_path = srcdir + '/bin/default/lib/uid_wrapper/libuid-wrapper.so'