Reject passing in -u,-g multiple times
This avoids potential errors where a user/group is clobbered by a
following flag.
Bug: chromium:912146
Test: make tests
Change-Id: I5038fcc9e2e4c9757ea152295afde6367915677e
diff --git a/minijail0_cli.c b/minijail0_cli.c
index 2e25ca6..2106ccb 100644
--- a/minijail0_cli.c
+++ b/minijail0_cli.c
@@ -7,6 +7,7 @@
#include <errno.h>
#include <getopt.h>
#include <inttypes.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -573,6 +574,7 @@
int inherit_suppl_gids = 0, keep_suppl_gids = 0;
int caps = 0, ambient_caps = 0;
int seccomp = -1;
+ bool use_uid = false, use_gid = false;
uid_t uid = 0;
gid_t gid = 0;
char *uidmap = NULL, *gidmap = NULL;
@@ -601,9 +603,21 @@
-1) {
switch (opt) {
case 'u':
+ if (use_uid) {
+ fprintf(stderr,
+ "-u provided multiple times.\n");
+ exit(1);
+ }
+ use_uid = true;
set_user(j, optarg, &uid, &gid);
break;
case 'g':
+ if (use_gid) {
+ fprintf(stderr,
+ "-g provided multiple times.\n");
+ exit(1);
+ }
+ use_gid = true;
set_group(j, optarg, &gid);
break;
case 'n':
diff --git a/minijail0_cli_unittest.cc b/minijail0_cli_unittest.cc
index d5f3c98..a00541a 100644
--- a/minijail0_cli_unittest.cc
+++ b/minijail0_cli_unittest.cc
@@ -123,6 +123,11 @@
argv[1] = "1000x";
ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1), "");
+
+ // Supplying -u more than once is bad.
+ argv = {"-u", kValidUser, "-u", kValidUid, "/bin/sh"};
+ ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1),
+ "-u provided multiple times");
}
// Valid calls to the change group option.
@@ -146,6 +151,11 @@
argv[1] = "1000x";
ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1), "");
+
+ // Supplying -g more than once is bad.
+ argv = {"-g", kValidGroup, "-g", kValidGid, "/bin/sh"};
+ ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1),
+ "-g provided multiple times");
}
// Valid calls to the skip securebits option.