aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Hector Chavez <lhchavez@google.com>2018-01-30 01:37:07 +0000
committerandroid-build-merger <android-build-merger@google.com>2018-01-30 01:37:07 +0000
commit5c016c17a8d40370d500fd4e03605900f2e30240 (patch)
treeb48818d5c1bcb2e7af4a04a904bf4e394c73e2ce
parent0d14394e89239728aee9182242bb54f09b29f633 (diff)
parentd810e03405f6d2a34185fe621040c0aa7244e7eb (diff)
downloadminijail-5c016c17a8d40370d500fd4e03605900f2e30240.tar.gz
Use rlim_t for the arguments in minijail_rlimit() am: 7058a2debe
am: d810e03405 Change-Id: I2c03052acfb9dd484a411877fca8a47cdd17672d
-rw-r--r--libminijail.c7
-rw-r--r--libminijail.h3
-rw-r--r--minijail0.16
-rw-r--r--minijail0_cli.c25
-rw-r--r--minijail0_cli_unittest.cc14
5 files changed, 45 insertions, 10 deletions
diff --git a/libminijail.c b/libminijail.c
index 9cf3232..900acd5 100644
--- a/libminijail.c
+++ b/libminijail.c
@@ -84,8 +84,8 @@
struct minijail_rlimit {
int type;
- uint32_t cur;
- uint32_t max;
+ rlim_t cur;
+ rlim_t max;
};
struct mountpoint {
@@ -662,8 +662,7 @@ int API minijail_add_to_cgroup(struct minijail *j, const char *path)
return 0;
}
-int API minijail_rlimit(struct minijail *j, int type, uint32_t cur,
- uint32_t max)
+int API minijail_rlimit(struct minijail *j, int type, rlim_t cur, rlim_t max)
{
size_t i;
diff --git a/libminijail.h b/libminijail.h
index 46dc311..04e4153 100644
--- a/libminijail.h
+++ b/libminijail.h
@@ -16,6 +16,7 @@
#define _LIBMINIJAIL_H_
#include <stdint.h>
+#include <sys/resource.h>
#include <sys/types.h>
#ifdef __cplusplus
@@ -128,7 +129,7 @@ void minijail_inherit_usergroups(struct minijail *j);
int minijail_use_alt_syscall(struct minijail *j, const char *table);
/* Sets the given runtime limit. See getrlimit(2). */
-int minijail_rlimit(struct minijail *j, int type, uint32_t cur, uint32_t max);
+int minijail_rlimit(struct minijail *j, int type, rlim_t cur, rlim_t max);
/*
* Adds the jailed process to the cgroup given by |path|. |path| should be the
diff --git a/minijail0.1 b/minijail0.1
index 52f98e2..9c962b4 100644
--- a/minijail0.1
+++ b/minijail0.1
@@ -119,8 +119,10 @@ Remount /proc readonly. This implies \fB-v\fR. Remounting /proc readonly means
that even if the process has write access to a system config knob in /proc
(e.g., in /sys/kernel), it cannot change the value.
.TP
-\fB-R <rlim_type, rlim_cur, rlim_max>\fR
-Set an rlimit value, see \fBgetrlimit\fR(2) for allowed values.
+\fB-R <rlim_type>,<rlim_cur>,<rlim_max>\fR
+Set an rlimit value, see \fBgetrlimit\fR(2) for allowed values. The string
+\fBunlimited\fR can be used for \fBrlim_cur\fR and \fBrlim_max\fR, which will
+translate to \fBRLIM_INFINITY\fR.
.TP
\fB-s\fR
Enable \fBseccomp\fR(2) in mode 1, which restricts the child process to a very
diff --git a/minijail0_cli.c b/minijail0_cli.c
index dc83c8b..ea4b6cc 100644
--- a/minijail0_cli.c
+++ b/minijail0_cli.c
@@ -115,12 +115,35 @@ static void add_rlimit(struct minijail *j, char *arg)
char *type = tokenize(&arg, ",");
char *cur = tokenize(&arg, ",");
char *max = tokenize(&arg, ",");
+ char *end;
if (!type || type[0] == '\0' || !cur || cur[0] == '\0' ||
!max || max[0] == '\0' || arg != NULL) {
fprintf(stderr, "Bad rlimit '%s'.\n", arg);
exit(1);
}
- if (minijail_rlimit(j, atoi(type), atoi(cur), atoi(max))) {
+ rlim_t cur_rlim;
+ rlim_t max_rlim;
+ if (!strcmp(cur, "unlimited")) {
+ cur_rlim = RLIM_INFINITY;
+ } else {
+ end = NULL;
+ cur_rlim = strtoul(cur, &end, 10);
+ if (*end) {
+ fprintf(stderr, "Bad soft limit: '%s'.\n", cur);
+ exit(1);
+ }
+ }
+ if (!strcmp(max, "unlimited")) {
+ max_rlim = RLIM_INFINITY;
+ } else {
+ end = NULL;
+ max_rlim = strtoul(max, &end, 10);
+ if (*end) {
+ fprintf(stderr, "Bad hard limit: '%s'.\n", max);
+ exit(1);
+ }
+ }
+ if (minijail_rlimit(j, atoi(type), cur_rlim, max_rlim)) {
fprintf(stderr, "minijail_rlimit '%s,%s,%s' failed.\n", type,
cur, max);
exit(1);
diff --git a/minijail0_cli_unittest.cc b/minijail0_cli_unittest.cc
index 856243a..e6cf544 100644
--- a/minijail0_cli_unittest.cc
+++ b/minijail0_cli_unittest.cc
@@ -215,6 +215,12 @@ TEST_F(CliTest, valid_rlimit) {
argv[1] = "0,1,2";
ASSERT_TRUE(parse_args_(argv));
+
+ argv[1] = "1,1,unlimited";
+ ASSERT_TRUE(parse_args_(argv));
+
+ argv[1] = "2,unlimited,2";
+ ASSERT_TRUE(parse_args_(argv));
}
// Invalid calls to the rlimit option.
@@ -234,8 +240,12 @@ TEST_F(CliTest, invalid_rlimit) {
argv[1] = "0,0,0,0";
ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1), "");
- // TODO: We probably should reject non-numbers, but the current CLI ignores
- // them and converts them to zeros. Oops.
+ // Non-numeric limits
+ argv[1] = "0,0,invalid-limit";
+ ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1), "");
+
+ argv[1] = "0,0,0j";
+ ASSERT_EXIT(parse_args_(argv), testing::ExitedWithCode(1), "");
}
// Valid calls to the profile option.