diff options
author | Robin Hack <hack.robin@gmail.com> | 2015-01-23 15:27:25 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2015-01-28 17:17:07 +0100 |
commit | 34062ac77a0aab77f0ab427e34d47ce418e78259 (patch) | |
tree | 20599cf0da28d1ee9eda0719008d998a5573b5cc /lib | |
parent | fbdd2d46249235aac3adaa9f20b707d6aedb0bfc (diff) | |
download | samba-34062ac77a0aab77f0ab427e34d47ce418e78259.tar.gz |
uwrap: Add support for getresuid() and getresgid() glibc/syscall.
Signed-off-by: Robin Hack <hack.robin@gmail.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/uid_wrapper/uid_wrapper.c | 109 | ||||
-rw-r--r-- | lib/uid_wrapper/wscript | 2 |
2 files changed, 111 insertions, 0 deletions
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 @@ -190,6 +190,9 @@ struct uwrap_libc_fns { #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); int (*_libc_setgid)(gid_t gid); @@ -203,6 +206,9 @@ struct uwrap_libc_fns { #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[]); int (*_libc_setgroups)(size_t size, const 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' |