]> granicus.if.org Git - shadow/commitdiff
userns: add argument sanity checking
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Fri, 21 Jun 2013 16:47:36 +0000 (11:47 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 5 Aug 2013 15:08:46 +0000 (10:08 -0500)
In find_new_sub_{u,g}ids, check for min, count and max values.

In idmapping.c:get_map_ranges(), make sure that the value passed
in for ranges did not overflow.  Couldn't happen with the current
code, but this is a sanity check for any future potential mis-uses.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
libmisc/find_new_sub_gids.c
libmisc/find_new_sub_uids.c
libmisc/idmapping.c

index 68046ac81aa768a947975c3f76a30afd69da48e5..fd44978e943503a8f213a9e2118cbb52fd1fff08 100644 (file)
@@ -58,6 +58,14 @@ int find_new_sub_gids (const char *owner,
        max = getdef_ulong ("SUB_GID_MAX", 600100000UL);
        count = getdef_ulong ("SUB_GID_COUNT", 10000);
 
+       if (min >= max || count >= max || (min + count) >= max) {
+               (void) fprintf (stderr,
+                               _("%s: Invalid configuration: SUB_GID_MIN (%lu),"
+                                 " SUB_GID_MAX (%lu), SUB_GID_COUNT (%lu)\n"),
+                       Prog, min, max, count);
+               return -1;
+       }
+
        /* Is there a preferred range that works? */
        if ((*range_count != 0) &&
            (*range_start >= min) &&
index f1720f91506afb8799df89b79f35053fea57f7c6..b608c59d2b6afde4916d6553b62ad2d8b0f04ec0 100644 (file)
@@ -58,6 +58,14 @@ int find_new_sub_uids (const char *owner,
        max = getdef_ulong ("SUB_UID_MAX", 600100000UL);
        count = getdef_ulong ("SUB_UID_COUNT", 10000);
 
+       if (min >= max || count >= max || (min + count) >= max) {
+               (void) fprintf (stderr,
+                               _("%s: Invalid configuration: SUB_UID_MIN (%lu),"
+                                 " SUB_UID_MAX (%lu), SUB_UID_COUNT (%lu)\n"),
+                       Prog, min, max, count);
+               return -1;
+       }
+
        /* Is there a preferred range that works? */
        if ((*range_count != 0) &&
            (*range_start >= min) &&
index cb9e898505afd6747dd2e0b93dfe34a49929e1ee..4147796b2d953f013ded525130f87d781a4236fe 100644 (file)
@@ -41,6 +41,16 @@ struct map_range *get_map_ranges(int ranges, int argc, char **argv)
        struct map_range *mappings, *mapping;
        int idx, argidx;
 
+       if (ranges < 0 || argc < 0) {
+               fprintf(stderr, "%s: error calculating number of arguments\n", Prog);
+               return NULL;
+       }
+
+       if (ranges != ((argc - 2) + 2) / 3) {
+               fprintf(stderr, "%s: ranges: %u is wrong for argc: %d\n", Prog, ranges, argc);
+               return NULL;
+       }
+
        if ((ranges * 3) > argc) {
                fprintf(stderr, "ranges: %u argc: %d\n",
                        ranges, argc);