Improve diagnostics for lookup_{user,group}
Make sure to pass error codes back to callers and include them in
diagnostics printed by minijail0.
Bug: chromium:1055067
Test: Compiles and passes tests.
Change-Id: Ic07c5917e7826dd7cf2bfbd3483ad97ad199b670
diff --git a/minijail0_cli.c b/minijail0_cli.c
index c8b700b..c3da5de 100644
--- a/minijail0_cli.c
+++ b/minijail0_cli.c
@@ -40,13 +40,16 @@
return;
}
- if (lookup_user(arg, out_uid, out_gid)) {
- fprintf(stderr, "Bad user: '%s'\n", arg);
+ int ret = lookup_user(arg, out_uid, out_gid);
+ if (ret) {
+ fprintf(stderr, "Bad user '%s': %s\n", arg, strerror(-ret));
exit(1);
}
- if (minijail_change_user(j, arg)) {
- fprintf(stderr, "Bad user: '%s'\n", arg);
+ ret = minijail_change_user(j, arg);
+ if (ret) {
+ fprintf(stderr, "minijail_change_user('%s') failed: %s\n", arg,
+ strerror(-ret));
exit(1);
}
}
@@ -61,15 +64,13 @@
return;
}
- if (lookup_group(arg, out_gid)) {
- fprintf(stderr, "Bad group: '%s'\n", arg);
+ int ret = lookup_group(arg, out_gid);
+ if (ret) {
+ fprintf(stderr, "Bad group '%s': %s\n", arg, strerror(-ret));
exit(1);
}
- if (minijail_change_group(j, arg)) {
- fprintf(stderr, "Bad group: '%s'\n", arg);
- exit(1);
- }
+ minijail_change_gid(j, *out_gid);
}
/*
@@ -81,15 +82,16 @@
char *end = NULL;
int groupid = strtod(arg, &end);
gid_t gid;
+ int ret;
if (!*end && *arg) {
/* A gid number has been specified, proceed. */
gid = groupid;
- } else if (lookup_group(arg, &gid)) {
+ } else if ((ret = lookup_group(arg, &gid))) {
/*
* A group name has been specified,
* but doesn't exist: we bail out.
*/
- fprintf(stderr, "Bad group: '%s'\n", arg);
+ fprintf(stderr, "Bad group '%s': %s\n", arg, strerror(-ret));
exit(1);
}
diff --git a/system.c b/system.c
index 5d39f0f..81fd393 100644
--- a/system.c
+++ b/system.c
@@ -395,7 +395,8 @@
buf = malloc(sz);
if (!buf)
return -ENOMEM;
- getpwnam_r(user, &pw, buf, sz, &ppw);
+
+ int ret = getpwnam_r(user, &pw, buf, sz, &ppw);
/*
* We're safe to free the buffer here. The strings inside |pw| point
* inside |buf|, but we don't use any of them; this leaves the pointers
@@ -403,9 +404,11 @@
* succeeded.
*/
free(buf);
- /* getpwnam_r(3) does *not* set errno when |ppw| is NULL. */
+
+ if (ret != 0)
+ return -ret; /* Error */
if (!ppw)
- return -1;
+ return -ENOENT; /* Not found */
*uid = ppw->pw_uid;
*gid = ppw->pw_gid;
@@ -431,16 +434,18 @@
buf = malloc(sz);
if (!buf)
return -ENOMEM;
- getgrnam_r(group, &gr, buf, sz, &pgr);
+ int ret = getgrnam_r(group, &gr, buf, sz, &pgr);
/*
* We're safe to free the buffer here. The strings inside gr point
* inside buf, but we don't use any of them; this leaves the pointers
* dangling but it's safe. pgr points at gr if getgrnam_r succeeded.
*/
free(buf);
- /* getgrnam_r(3) does *not* set errno when |pgr| is NULL. */
+
+ if (ret != 0)
+ return -ret; /* Error */
if (!pgr)
- return -1;
+ return -ENOENT; /* Not found */
*gid = pgr->gr_gid;
return 0;