Page MenuHomeFreeBSD

D51509.id159047.diff
No OneTemporary

D51509.id159047.diff

diff --git a/usr.sbin/chroot/chroot.c b/usr.sbin/chroot/chroot.c
--- a/usr.sbin/chroot/chroot.c
+++ b/usr.sbin/chroot/chroot.c
@@ -34,6 +34,7 @@
#include <ctype.h>
#include <err.h>
+#include <errno.h>
#include <grp.h>
#include <limits.h>
#include <paths.h>
@@ -46,17 +47,59 @@
static void usage(void) __dead2;
+static void
+resolve_group(const char *group, gid_t *ogid)
+{
+ struct group *gp;
+
+ gp = getgrnam(group);
+ if (gp == NULL) {
+ char *endp;
+ unsigned long gid;
+
+ errno = 0;
+ gid = strtoul(group, &endp, 0);
+ if (errno == 0 && *endp == '\0')
+ gp = getgrgid(gid);
+ }
+
+ if (gp == NULL)
+ errx(1, "no such group '%s'", group);
+
+ *ogid = gp->gr_gid;
+}
+
+static void
+resolve_user(const char *user, uid_t *ouid)
+{
+ struct passwd *pw;
+
+ pw = getpwnam(user);
+ if (pw == NULL) {
+ char *endp;
+ unsigned long uid;
+
+ errno = 0;
+ uid = strtoul(user, &endp, 0);
+ if (errno == 0 && *endp == '\0')
+ pw = getpwuid(uid);
+ }
+
+ if (pw == NULL)
+ errx(1, "no such user '%s'", user);
+
+ *ouid = pw->pw_uid;
+}
+
int
main(int argc, char *argv[])
{
- struct group *gp;
- struct passwd *pw;
- char *endp, *p, *user, *group, *grouplist;
- const char *shell;
+ const char *group, *p, *shell, *user;
+ char *grouplist;
+ long ngroups_max;
gid_t gid, *gidlist;
uid_t uid;
int arg, ch, error, gids;
- long ngroups_max;
bool nonprivileged;
gid = 0;
@@ -94,19 +137,8 @@
if (argc < 1)
usage();
- if (group != NULL) {
- if (isdigit((unsigned char)*group)) {
- gid = (gid_t)strtoul(group, &endp, 0);
- if (*endp != '\0')
- goto getgroup;
- } else {
- getgroup:
- if ((gp = getgrnam(group)) != NULL)
- gid = gp->gr_gid;
- else
- errx(1, "no such group `%s'", group);
- }
- }
+ if (group != NULL)
+ resolve_group(group, &gid);
ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
if ((gidlist = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
@@ -121,35 +153,13 @@
if (*p == '\0')
continue;
- if (isdigit((unsigned char)*p)) {
- gidlist[gids] = (gid_t)strtoul(p, &endp, 0);
- if (*endp != '\0')
- goto getglist;
- } else {
- getglist:
- if ((gp = getgrnam(p)) != NULL)
- gidlist[gids] = gp->gr_gid;
- else
- errx(1, "no such group `%s'", p);
- }
- gids++;
+ resolve_group(p, &gidlist[gids++]);
}
if (p != NULL && gids == ngroups_max)
errx(1, "too many supplementary groups provided");
- if (user != NULL) {
- if (isdigit((unsigned char)*user)) {
- uid = (uid_t)strtoul(user, &endp, 0);
- if (*endp != '\0')
- goto getuser;
- } else {
- getuser:
- if ((pw = getpwnam(user)) != NULL)
- uid = pw->pw_uid;
- else
- errx(1, "no such user `%s'", user);
- }
- }
+ if (user != NULL)
+ resolve_user(user, &uid);
if (nonprivileged) {
arg = PROC_NO_NEW_PRIVS_ENABLE;

File Metadata

Mime Type
text/plain
Expires
Sat, Dec 27, 5:03 AM (4 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27298197
Default Alt Text
D51509.id159047.diff (2 KB)

Event Timeline