uwrap: Improve parsing IDs from env variables
authorAndreas Schneider <asn@samba.org>
Tue, 1 Aug 2017 06:14:30 +0000 (08:14 +0200)
committerAndreas Schneider <asn@samba.org>
Tue, 1 Aug 2017 13:13:07 +0000 (15:13 +0200)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
src/uid_wrapper.c

index 9bd154a7be1cc8997ea148479efe8fc5241528e4..9c4b0ee78d3e7cb48ea49e3f3a8587bfe85d92e5 100644 (file)
@@ -34,6 +34,7 @@
 #include <syscall.h>
 #endif
 #include <dlfcn.h>
+#include <limits.h>
 
 #include <pthread.h>
 
@@ -972,6 +973,31 @@ static void uwrap_thread_child(void)
        UWRAP_UNLOCK_ALL;
 }
 
+static unsigned long uwrap_get_xid_from_env(const char *envname)
+{
+       unsigned long xid;
+       const char *env = NULL;
+       char *endp = NULL;
+
+       env = getenv(envname);
+       if (env == NULL) {
+               return ULONG_MAX;
+       }
+
+       if (env[0] == '\0') {
+               unsetenv("UID_WRAPPER_INITIAL_RUID");
+               return ULONG_MAX;
+       }
+
+       xid = strtoul(env, &endp, 10);
+       unsetenv("UID_WRAPPER_INITIAL_RUID");
+       if (env == endp) {
+               return ULONG_MAX;
+       }
+
+       return xid;
+}
+
 /*
  * This initializes uid_wrapper with the IDs exported to the environment. Those
  * are normally set after we forked and executed.
@@ -980,47 +1006,38 @@ static void uwrap_init_env(struct uwrap_thread *id)
 {
        const char *env;
        int ngroups = 0;
+       unsigned long xid;
 
-       env = getenv("UID_WRAPPER_INITIAL_RUID");
-       if (env != NULL && env[0] != '\0') {
-               UWRAP_LOG(UWRAP_LOG_DEBUG, "Initialize ruid with %s", env);
-               id->ruid = strtoul(env, (char **)NULL, 10);
-               unsetenv("UID_WRAPPER_INITIAL_RUID");
+       /* UIDs */
+       xid = uwrap_get_xid_from_env("UID_WRAPPER_INITIAL_RUID");
+       if (xid != ULONG_MAX) {
+               id->ruid = (uid_t)xid;
        }
 
-       env = getenv("UID_WRAPPER_INITIAL_EUID");
-       if (env != NULL && env[0] != '\0') {
-               UWRAP_LOG(UWRAP_LOG_DEBUG, "Initalize euid with %s", env);
-               id->euid = strtoul(env, (char **)NULL, 10);
-               unsetenv("UID_WRAPPER_INITIAL_EUID");
+       xid = uwrap_get_xid_from_env("UID_WRAPPER_INITIAL_EUID");
+       if (xid != ULONG_MAX) {
+               id->euid = (uid_t)xid;
        }
 
-       env = getenv("UID_WRAPPER_INITIAL_SUID");
-       if (env != NULL && env[0] != '\0') {
-               UWRAP_LOG(UWRAP_LOG_DEBUG, "Initalize suid with %s", env);
-               id->suid = strtoul(env, (char **)NULL, 10);
-               unsetenv("UID_WRAPPER_INITIAL_SUID");
+       xid = uwrap_get_xid_from_env("UID_WRAPPER_INITIAL_SUID");
+       if (xid != ULONG_MAX) {
+               id->suid = (uid_t)xid;
        }
 
-       env = getenv("UID_WRAPPER_INITIAL_RGID");
-       if (env != NULL && env[0] != '\0') {
-               UWRAP_LOG(UWRAP_LOG_DEBUG, "Initialize ruid with %s", env);
-               id->rgid = strtoul(env, (char **)NULL, 10);
-               unsetenv("UID_WRAPPER_INITIAL_RGID");
+       /* GIDs */
+       xid = uwrap_get_xid_from_env("UID_WRAPPER_INITIAL_RGID");
+       if (xid != ULONG_MAX) {
+               id->rgid = (gid_t)xid;
        }
 
-       env = getenv("UID_WRAPPER_INITIAL_EGID");
-       if (env != NULL && env[0] != '\0') {
-               UWRAP_LOG(UWRAP_LOG_DEBUG, "Initalize egid with %s", env);
-               id->egid = strtoul(env, (char **)NULL, 10);
-               unsetenv("UID_WRAPPER_INITIAL_EGID");
+       xid = uwrap_get_xid_from_env("UID_WRAPPER_INITIAL_EGID");
+       if (xid != ULONG_MAX) {
+               id->egid = (gid_t)xid;
        }
 
-       env = getenv("UID_WRAPPER_INITIAL_SGID");
-       if (env != NULL && env[0] != '\0') {
-               UWRAP_LOG(UWRAP_LOG_DEBUG, "Initalize sgid with %s", env);
-               id->sgid = strtoul(env, (char **)NULL, 10);
-               unsetenv("UID_WRAPPER_INITIAL_SGID");
+       xid = uwrap_get_xid_from_env("UID_WRAPPER_INITIAL_SGID");
+       if (xid != ULONG_MAX) {
+               id->sgid = (gid_t)xid;
        }
 
        env = getenv("UID_WRAPPER_INITIAL_GROUPS_COUNT");