summaryrefslogtreecommitdiff
path: root/lib/uid_wrapper
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2009-08-05 10:50:03 +1000
committerAndrew Tridgell <tridge@samba.org>2009-08-05 10:51:00 +1000
commitfd43e0ee09e3f82093e9a15dd6cbd2fbaa113426 (patch)
treeb9971f7c8b9758dec89f109a2e79dd0ad899f4f2 /lib/uid_wrapper
parent3e3f64f05fa5d970b058c4b21b6ecd40b883e8e6 (diff)
downloadsamba-fd43e0ee09e3f82093e9a15dd6cbd2fbaa113426.tar.gz
samba-fd43e0ee09e3f82093e9a15dd6cbd2fbaa113426.tar.bz2
samba-fd43e0ee09e3f82093e9a15dd6cbd2fbaa113426.zip
added a uid_wrapper library
This library intercepts seteuid and related calls, and simulates them in a manner similar to the nss_wrapper and socket_wrapper libraries. This allows us to enable the vfs_unixuid NTVFS module in the build farm, which means we are more likely to catch errors in the token manipulation. The simulation is not complete, but it is enough for Samba4 for now. The major areas of incompleteness are: - no emulation of setreuid, setresuid or saved uids. These would be needed for use in Samba3 - no emulation of ruid changing. That would also be needed for Samba3 - no attempt to emulate file ownership changing, so code that (for example) tests whether st.st_uid matches geteuid() needs special handling
Diffstat (limited to 'lib/uid_wrapper')
-rw-r--r--lib/uid_wrapper/config.m416
-rw-r--r--lib/uid_wrapper/config.mk9
-rw-r--r--lib/uid_wrapper/uid_wrapper.c147
-rw-r--r--lib/uid_wrapper/uid_wrapper.h61
4 files changed, 233 insertions, 0 deletions
diff --git a/lib/uid_wrapper/config.m4 b/lib/uid_wrapper/config.m4
new file mode 100644
index 0000000000..db6537bf95
--- /dev/null
+++ b/lib/uid_wrapper/config.m4
@@ -0,0 +1,16 @@
+AC_ARG_ENABLE(uid-wrapper,
+AS_HELP_STRING([--enable-uid-wrapper], [Turn on uid wrapper library (default=no)]))
+
+HAVE_UID_WRAPPER=no
+
+if eval "test x$developer = xyes"; then
+ enable_uid_wrapper=yes
+fi
+
+if eval "test x$enable_uid_wrapper = xyes"; then
+ AC_DEFINE(UID_WRAPPER,1,[Use uid wrapper library])
+ HAVE_UID_WRAPPER=yes
+fi
+
+AC_SUBST(HAVE_UID_WRAPPER)
+AC_SUBST(UID_WRAPPER_OBJS)
diff --git a/lib/uid_wrapper/config.mk b/lib/uid_wrapper/config.mk
new file mode 100644
index 0000000000..1bebc68118
--- /dev/null
+++ b/lib/uid_wrapper/config.mk
@@ -0,0 +1,9 @@
+##############################
+# Start SUBSYSTEM UID_WRAPPER
+[SUBSYSTEM::UID_WRAPPER]
+PRIVATE_DEPENDENCIES = LIBTALLOC
+# End SUBSYSTEM UID_WRAPPER
+##############################
+
+UID_WRAPPER_OBJ_FILES = $(uidwrappersrcdir)/uid_wrapper.o
+
diff --git a/lib/uid_wrapper/uid_wrapper.c b/lib/uid_wrapper/uid_wrapper.c
new file mode 100644
index 0000000000..e009fa0b5c
--- /dev/null
+++ b/lib/uid_wrapper/uid_wrapper.c
@@ -0,0 +1,147 @@
+/*
+ Copyright (C) Andrew Tridgell 2009
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define UID_WRAPPER_NOT_REPLACE
+#include "includes.h"
+#include "system/passwd.h"
+#include "system/filesys.h"
+
+#ifndef _PUBLIC_
+#define _PUBLIC_
+#endif
+
+/*
+ we keep the virtualised euid/egid/groups information here
+ */
+static struct {
+ bool initialised;
+ bool enabled;
+ uid_t euid;
+ gid_t egid;
+ unsigned ngroups;
+ gid_t *groups;
+} uwrap;
+
+static void uwrap_init(void)
+{
+ if (uwrap.initialised) return;
+ uwrap.initialised = true;
+ if (getenv("UID_WRAPPER")) {
+ uwrap.enabled = true;
+ }
+}
+
+_PUBLIC_ int uwrap_seteuid(uid_t euid)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return seteuid(euid);
+ }
+ /* assume for now that the ruid stays as root */
+ uwrap.euid = euid;
+ return 0;
+}
+
+_PUBLIC_ uid_t uwrap_geteuid(void)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return geteuid();
+ }
+ return uwrap.euid;
+}
+
+_PUBLIC_ int uwrap_setegid(gid_t egid)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return setegid(egid);
+ }
+ /* assume for now that the ruid stays as root */
+ uwrap.egid = egid;
+ return 0;
+}
+
+_PUBLIC_ uid_t uwrap_getegid(void)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return getegid();
+ }
+ return uwrap.egid;
+}
+
+_PUBLIC_ int uwrap_setgroups(size_t size, const gid_t *list)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return setgroups(size, list);
+ }
+
+ talloc_free(uwrap.groups);
+ uwrap.ngroups = 0;
+
+ uwrap.groups = talloc_array(talloc_autofree_context(), gid_t, size);
+ if (uwrap.groups == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+ memcpy(uwrap.groups, list, size*sizeof(gid_t));
+ uwrap.ngroups = size;
+ return 0;
+}
+
+_PUBLIC_ int uwrap_getgroups(int size, gid_t *list)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return getgroups(size, list);
+ }
+
+ if (size > uwrap.ngroups) {
+ size = uwrap.ngroups;
+ }
+ if (size == 0) {
+ return uwrap.ngroups;
+ }
+ if (size < uwrap.ngroups) {
+ errno = EINVAL;
+ return -1;
+ }
+ memcpy(list, uwrap.groups, size*sizeof(gid_t));
+ return 0;
+}
+
+_PUBLIC_ uid_t uwrap_getuid(void)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return getuid();
+ }
+ /* we don't simulate ruid changing */
+ return 0;
+}
+
+_PUBLIC_ gid_t uwrap_getgid(void)
+{
+ uwrap_init();
+ if (!uwrap.enabled) {
+ return getgid();
+ }
+ /* we don't simulate rgid changing */
+ return 0;
+}
diff --git a/lib/uid_wrapper/uid_wrapper.h b/lib/uid_wrapper/uid_wrapper.h
new file mode 100644
index 0000000000..e2df613f50
--- /dev/null
+++ b/lib/uid_wrapper/uid_wrapper.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) Andrew Tridgell 2009
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __UID_WRAPPER_H__
+#define __UID_WRAPPER_H__
+
+#ifdef seteuid
+#undef seteuid
+#endif
+#define seteuid uwrap_seteuid
+
+#ifdef setegid
+#undef setegid
+#endif
+#define setegid uwrap_setegid
+
+#ifdef geteuid
+#undef geteuid
+#endif
+#define geteuid uwrap_geteuid
+
+#ifdef getegid
+#undef getegid
+#endif
+#define getegid uwrap_getegid
+
+#ifdef setgroups
+#undef setgroups
+#endif
+#define setgroups uwrap_setgroups
+
+#ifdef getgroups
+#undef getgroups
+#endif
+#define getgroups uwrap_getgroups
+
+#ifdef getuid
+#undef getuid
+#endif
+#define getuid uwrap_getuid
+
+#ifdef getgid
+#undef getgid
+#endif
+#define getgid uwrap_getgid
+
+#endif /* __UID_WRAPPER_H__ */