summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobin Hack <hack.robin@gmail.com>2015-01-23 15:27:25 +0100
committerAndreas Schneider <asn@cryptomilk.org>2015-01-28 17:17:07 +0100
commit34062ac77a0aab77f0ab427e34d47ce418e78259 (patch)
tree20599cf0da28d1ee9eda0719008d998a5573b5cc /lib
parentfbdd2d46249235aac3adaa9f20b707d6aedb0bfc (diff)
downloadsamba-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.c109
-rw-r--r--lib/uid_wrapper/wscript2
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'