commit 42747b987630ba558f7a9ac484023a6c6afbdc3b
parent ae9d405c2ccb140ba738a1f65e789a8bde7bf048
Author: Gerrit Pape <pape@smarden.org>
Date: Tue, 17 Apr 2007 07:49:09 +0000
chpst.c, uidgid.c: improve error reporting if getpwnam() or getgrnam() fails
...cleanup.
Diffstat:
3 files changed, 37 insertions(+), 35 deletions(-)
diff --git a/package/CHANGES b/package/CHANGES
@@ -2,6 +2,8 @@
number of log files svlogd should maintain has been reduced; add hint
about increasing the buffer size if lots of data is to be processed
in short time.
+ * chpst.c, uidgid.c: improve error reporting if getpwnam() or getgrnam()
+ fails; cleanup.
1.7.2
Tue, 21 Nov 2006 15:13:47 +0000
diff --git a/src/chpst.c b/src/chpst.c
@@ -64,17 +64,17 @@ unsigned int lockdelay;
void suidgid(char *user, unsigned int ext) {
struct uidgid ugid;
- if (ext) {
+ if (ext)
if (! uidgids_get(&ugid, user)) {
- if (*user == ':')
- fatalx("invalid uid/gids", user +1);
- else
+ if (*user == ':') fatalx("invalid uid/gids", user +1);
+ if (errno) fatal("unable to get password/group file entry");
fatalx("unknown user/group", user);
}
- }
- else
- if (! uidgid_get(&ugid, user))
+ else
+ if (! uidgid_get(&ugid, user)) {
+ if (errno) fatal("unable to get password file entry");
fatalx("unknown account", user);
+ }
if (setgroups(ugid.gids, ugid.gid) == -1) fatal("unable to setgroups");
if (setgid(*ugid.gid) == -1) fatal("unable to setgid");
if (prot_uid(ugid.uid) == -1) fatal("unable to setuid");
@@ -84,17 +84,17 @@ void euidgid(char *user, unsigned int ext) {
struct uidgid ugid;
char bufnum[FMT_ULONG];
- if (ext) {
+ if (ext)
if (! uidgids_get(&ugid, user)) {
- if (*user == ':')
- fatalx("invalid uid/gids", user +1);
- else
+ if (*user == ':') fatalx("invalid uid/gids", user +1);
+ if (errno) fatal("unable to get password/group file entry");
fatalx("unknown user/group", user);
}
- }
- else
- if (! uidgid_get(&ugid, user))
+ else
+ if (! uidgid_get(&ugid, user)) {
+ if (errno) fatal("unable to get password file entry");
fatalx("unknown account", user);
+ }
bufnum[fmt_ulong(bufnum, *ugid.gid)] =0;
if (! pathexec_env("GID", bufnum)) die_nomem();
bufnum[fmt_ulong(bufnum, ugid.uid)] =0;
@@ -332,7 +332,6 @@ int main(int argc, const char *const *argv) {
if (chdir(root) == -1) fatal2("unable to change directory", root);
if (chroot(".") == -1) fatal("unable to change root directory");
}
- slimit();
if (nicelvl) {
errno =0;
if (nice(nicelvl) == -1) if (errno) fatal("unable to set nice level");
@@ -343,6 +342,7 @@ int main(int argc, const char *const *argv) {
if (nostdin) if (close(0) == -1) fatal("unable to close stdin");
if (nostdout) if (close(1) == -1) fatal("unable to close stdout");
if (nostderr) if (close(2) == -1) fatal("unable to close stderr");
+ slimit();
pathexec(argv);
fatal2("unable to run", *argv);
return(0);
diff --git a/src/uidgid.c b/src/uidgid.c
@@ -42,10 +42,10 @@ unsigned int uidgids_get(struct uidgid *u, char *ug) {
int i, d =0;
if (*ug == ':') return(uidgids_set(u, ug +1));
- if (ug[(d =str_chr(ug, ':'))] == ':') {
- ug[d] =0;
- g =ug +d +1;
- }
+ if (ug[(d =str_chr(ug, ':'))] == ':') {
+ ug[d] =0;
+ g =ug +d +1;
+ }
if (! (pwd =getpwnam(ug))) { if (g) ug[d] =':'; return(0); }
u->uid =pwd->pw_uid;
if (! g) {
@@ -53,22 +53,22 @@ unsigned int uidgids_get(struct uidgid *u, char *ug) {
u->gids =1;
return(1);
}
- ug[d] =':';
- for (i =0; i < 60; ++i) {
- if (g[(d =str_chr(g, ':'))] == ':') {
- g[d] =0;
- if (! (gr =getgrnam(g))) { g[d] =':'; return(0); }
- g[d] =':';
- u->gid[i] =gr->gr_gid;
- g +=d +1;
- }
- else {
- if (! (gr =getgrnam(g))) return(0);
- u->gid[i++] =gr->gr_gid;
- break;
- }
+ ug[d] =':';
+ for (i =0; i < 60; ++i) {
+ if (g[(d =str_chr(g, ':'))] == ':') {
+ g[d] =0;
+ if (! (gr =getgrnam(g))) { g[d] =':'; return(0); }
+ g[d] =':';
+ u->gid[i] =gr->gr_gid;
+ g +=d +1;
+ }
+ else {
+ if (! (gr =getgrnam(g))) return(0);
+ u->gid[i++] =gr->gr_gid;
+ break;
}
- u->gid[i] =0;
- u->gids =i;
+ }
+ u->gid[i] =0;
+ u->gids =i;
return(1);
}