nsjail: convert gids/uids to vector of structs
authorRobert Swiecki <robert@swiecki.net>
Fri, 9 Feb 2018 23:37:23 +0000 (00:37 +0100)
committerRobert Swiecki <robert@swiecki.net>
Fri, 9 Feb 2018 23:37:23 +0000 (00:37 +0100)
cmdline.cc
nsjail.h
user.cc

index 3cd8ff4..914e23f 100644 (file)
@@ -243,22 +243,22 @@ void logParams(struct nsjconf_t* nsjconf) {
        }
        {
                struct idmap_t* p;
-               TAILQ_FOREACH(p, &nsjconf->uids, pointers) {
+               for (const auto& uid : nsjconf->uids) {
                        LOG_I("Uid map: inside_uid:%lu outside_uid:%lu count:%zu newuidmap:%s",
-                           (unsigned long)p->inside_id, (unsigned long)p->outside_id, p->count,
-                           p->is_newidmap ? "true" : "false");
-                       if (p->outside_id == 0 && nsjconf->clone_newuser) {
+                           (unsigned long)uid.inside_id, (unsigned long)uid.outside_id, uid.count,
+                           uid.is_newidmap ? "true" : "false");
+                       if (uid.outside_id == 0 && nsjconf->clone_newuser) {
                                LOG_W(
                                    "Process will be UID/EUID=0 in the global user namespace, "
                                    "and will have user "
                                    "root-level access to files");
                        }
                }
-               TAILQ_FOREACH(p, &nsjconf->gids, pointers) {
+               for (const auto& gid : nsjconf->gids) {
                        LOG_I("Gid map: inside_gid:%lu outside_gid:%lu count:%zu newgidmap:%s",
-                           (unsigned long)p->inside_id, (unsigned long)p->outside_id, p->count,
-                           p->is_newidmap ? "true" : "false");
-                       if (p->outside_id == 0 && nsjconf->clone_newuser) {
+                           (unsigned long)gid.inside_id, (unsigned long)gid.outside_id, gid.count,
+                           gid.is_newidmap ? "true" : "false");
+                       if (gid.outside_id == 0 && nsjconf->clone_newuser) {
                                LOG_W(
                                    "Process will be GID/EGID=0 in the global user namespace, "
                                    "and will have group "
@@ -392,8 +392,6 @@ std::unique_ptr<struct nsjconf_t> parseArgs(int argc, char* argv[]) {
 
        TAILQ_INIT(&nsjconf->pids);
        TAILQ_INIT(&nsjconf->mountpts);
-       TAILQ_INIT(&nsjconf->uids);
-       TAILQ_INIT(&nsjconf->gids);
 
        static char cmdlineTmpfsSz[PATH_MAX] = "size=4194304";
 
@@ -789,23 +787,21 @@ std::unique_ptr<struct nsjconf_t> parseArgs(int argc, char* argv[]) {
                }
        }
 
-       if (TAILQ_EMPTY(&nsjconf->uids)) {
-               struct idmap_t* p =
-                   reinterpret_cast<struct idmap_t*>(util::memAlloc(sizeof(struct idmap_t)));
-               p->inside_id = getuid();
-               p->outside_id = getuid();
-               p->count = 1U;
-               p->is_newidmap = false;
-               TAILQ_INSERT_HEAD(&nsjconf->uids, p, pointers);
+       if (nsjconf->uids.empty()) {
+               struct idmap_t uid;
+               uid.inside_id = getuid();
+               uid.outside_id = getuid();
+               uid.count = 1U;
+               uid.is_newidmap = false;
+               nsjconf->uids.push_back(uid);
        }
-       if (TAILQ_EMPTY(&nsjconf->gids)) {
-               struct idmap_t* p =
-                   reinterpret_cast<struct idmap_t*>(util::memAlloc(sizeof(struct idmap_t)));
-               p->inside_id = getgid();
-               p->outside_id = getgid();
-               p->count = 1U;
-               p->is_newidmap = false;
-               TAILQ_INSERT_HEAD(&nsjconf->gids, p, pointers);
+       if (nsjconf->gids.empty()) {
+               struct idmap_t gid;
+               gid.inside_id = getgid();
+               gid.outside_id = getgid();
+               gid.count = 1U;
+               gid.is_newidmap = false;
+               nsjconf->gids.push_back(gid);
        }
 
        if (log::initLogFile(nsjconf.get()) == false) {
index 5d6abac..7616f18 100644 (file)
--- a/nsjail.h
+++ b/nsjail.h
@@ -173,14 +173,12 @@ struct nsjconf_t {
        struct sock_fprog seccomp_fprog;
        long num_cpus;
        uid_t orig_uid;
-       TAILQ_HEAD(udmaplist, idmap_t)
-       uids;
-       TAILQ_HEAD(gdmaplist, idmap_t)
-       gids;
        TAILQ_HEAD(pidslist, pids_t)
        pids;
        TAILQ_HEAD(mountptslist, mounts_t)
        mountpts;
+       std::vector<idmap_t> uids;
+       std::vector<idmap_t> gids;
        std::vector<std::string> envs;
        std::vector<int> openfds;
        std::vector<int> caps;
diff --git a/user.cc b/user.cc
index a43485a..7579bb0 100644 (file)
--- a/user.cc
+++ b/user.cc
@@ -104,12 +104,12 @@ static bool uidMapSelf(struct nsjconf_t* nsjconf, pid_t pid) {
        char map[4096] = {[0] = '\0'};
 
        struct idmap_t* p;
-       TAILQ_FOREACH(p, &nsjconf->uids, pointers) {
-               if (p->is_newidmap) {
+       for (const auto& uid : nsjconf->uids) {
+               if (uid.is_newidmap) {
                        continue;
                }
-               util::sSnPrintf(map, sizeof(map), "%lu %lu %zu\n", (unsigned long)p->inside_id,
-                   (unsigned long)p->outside_id, p->count);
+               util::sSnPrintf(map, sizeof(map), "%lu %lu %zu\n", (unsigned long)uid.inside_id,
+                   (unsigned long)uid.outside_id, uid.count);
        }
 
        if (strlen(map) == 0) {
@@ -132,12 +132,12 @@ static bool gidMapSelf(struct nsjconf_t* nsjconf, pid_t pid) {
        char map[4096] = {[0] = '\0'};
 
        struct idmap_t* p;
-       TAILQ_FOREACH(p, &nsjconf->gids, pointers) {
-               if (p->is_newidmap) {
+       for (const auto& gid : nsjconf->gids) {
+               if (gid.is_newidmap) {
                        continue;
                }
-               util::sSnPrintf(map, sizeof(map), "%lu %lu %zu\n", (unsigned long)p->inside_id,
-                   (unsigned long)p->outside_id, p->count);
+               util::sSnPrintf(map, sizeof(map), "%lu %lu %zu\n", (unsigned long)gid.inside_id,
+                   (unsigned long)gid.outside_id, gid.count);
        }
 
        if (strlen(map) == 0) {
@@ -168,8 +168,8 @@ static bool gidMapExternal(struct nsjconf_t* nsjconf, pid_t pid UNUSED) {
 
        struct idmap_t* p;
        bool use = false;
-       TAILQ_FOREACH(p, &nsjconf->gids, pointers) {
-               if (p->is_newidmap == false) {
+       for (const auto& gid : nsjconf->gids) {
+               if (gid.is_newidmap == false) {
                        continue;
                }
                if ((idx + 4) >= ARRAYSIZE(argv)) {
@@ -178,15 +178,15 @@ static bool gidMapExternal(struct nsjconf_t* nsjconf, pid_t pid UNUSED) {
                }
                use = true;
 
-               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)p->inside_id);
+               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)gid.inside_id);
                argv[idx] = parms[idx];
                idx++;
 
-               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)p->outside_id);
+               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)gid.outside_id);
                argv[idx] = parms[idx];
                idx++;
 
-               snprintf(parms[idx], sizeof(parms[idx]), "%zu", p->count);
+               snprintf(parms[idx], sizeof(parms[idx]), "%zu", gid.count);
                argv[idx] = parms[idx];
                idx++;
        }
@@ -220,8 +220,8 @@ static bool uidMapExternal(struct nsjconf_t* nsjconf, pid_t pid UNUSED) {
 
        bool use = false;
        struct idmap_t* p;
-       TAILQ_FOREACH(p, &nsjconf->uids, pointers) {
-               if (p->is_newidmap == false) {
+       for (const auto& uid : nsjconf->uids) {
+               if (uid.is_newidmap == false) {
                        continue;
                }
                if ((idx + 4) >= ARRAYSIZE(argv)) {
@@ -230,15 +230,15 @@ static bool uidMapExternal(struct nsjconf_t* nsjconf, pid_t pid UNUSED) {
                }
                use = true;
 
-               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)p->inside_id);
+               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)uid.inside_id);
                argv[idx] = parms[idx];
                idx++;
 
-               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)p->outside_id);
+               snprintf(parms[idx], sizeof(parms[idx]), "%u", (unsigned)uid.outside_id);
                argv[idx] = parms[idx];
                idx++;
 
-               snprintf(parms[idx], sizeof(parms[idx]), "%zu", p->count);
+               snprintf(parms[idx], sizeof(parms[idx]), "%zu", uid.count);
                argv[idx] = parms[idx];
                idx++;
        }
@@ -306,12 +306,12 @@ bool initNsFromChild(struct nsjconf_t* nsjconf) {
                return false;
        }
 
-       if (!setResGid(TAILQ_FIRST(&nsjconf->gids)->inside_id)) {
-               PLOG_E("setresgid(%u)", TAILQ_FIRST(&nsjconf->gids)->inside_id);
+       if (!setResGid(nsjconf->gids[0].inside_id)) {
+               PLOG_E("setresgid(%u)", nsjconf->gids[0].inside_id);
                return false;
        }
-       if (!setResUid(TAILQ_FIRST(&nsjconf->uids)->inside_id)) {
-               PLOG_E("setresuid(%u)", TAILQ_FIRST(&nsjconf->uids)->inside_id);
+       if (!setResUid(nsjconf->uids[0].inside_id)) {
+               PLOG_E("setresuid(%u)", nsjconf->uids[0].inside_id);
                return false;
        }
 
@@ -375,17 +375,16 @@ bool parseId(struct nsjconf_t* nsjconf, const char* i_id, const char* o_id, size
                }
        }
 
-       struct idmap_t* p =
-           reinterpret_cast<struct idmap_t*>(util::memAlloc(sizeof(struct idmap_t)));
-       p->inside_id = inside_id;
-       p->outside_id = outside_id;
-       p->count = cnt;
-       p->is_newidmap = is_newidmap;
+       struct idmap_t id;
+       id.inside_id = inside_id;
+       id.outside_id = outside_id;
+       id.count = cnt;
+       id.is_newidmap = is_newidmap;
 
        if (is_gid) {
-               TAILQ_INSERT_TAIL(&nsjconf->gids, p, pointers);
+               nsjconf->gids.push_back(id);
        } else {
-               TAILQ_INSERT_TAIL(&nsjconf->uids, p, pointers);
+               nsjconf->uids.push_back(id);
        }
 
        return true;