diff options
-rw-r--r-- | include/libbb.h | 1 | ||||
-rw-r--r-- | libbb/bb_pwd.c | 14 | ||||
-rw-r--r-- | loginutils/addgroup.c | 4 |
3 files changed, 11 insertions, 8 deletions
diff --git a/include/libbb.h b/include/libbb.h index 80311db2b..16e8f48db 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -703,6 +703,7 @@ void xget_uidgid(struct bb_uidgid_t*, const char*) FAST_FUNC; | |||
703 | /* chown-like handling of "user[:[group]" */ | 703 | /* chown-like handling of "user[:[group]" */ |
704 | void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group) FAST_FUNC; | 704 | void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group) FAST_FUNC; |
705 | struct passwd* xgetpwnam(const char *name) FAST_FUNC; | 705 | struct passwd* xgetpwnam(const char *name) FAST_FUNC; |
706 | struct group* xgetgrnam(const char *name) FAST_FUNC; | ||
706 | struct passwd* xgetpwuid(uid_t uid) FAST_FUNC; | 707 | struct passwd* xgetpwuid(uid_t uid) FAST_FUNC; |
707 | struct group* xgetgrgid(gid_t gid) FAST_FUNC; | 708 | struct group* xgetgrgid(gid_t gid) FAST_FUNC; |
708 | char* xuid2uname(uid_t uid) FAST_FUNC; | 709 | char* xuid2uname(uid_t uid) FAST_FUNC; |
diff --git a/libbb/bb_pwd.c b/libbb/bb_pwd.c index 5dbc58d9f..d72857771 100644 --- a/libbb/bb_pwd.c +++ b/libbb/bb_pwd.c | |||
@@ -23,7 +23,14 @@ struct passwd* FAST_FUNC xgetpwnam(const char *name) | |||
23 | return pw; | 23 | return pw; |
24 | } | 24 | } |
25 | 25 | ||
26 | /* xgetgrnam too? */ | 26 | struct group* FAST_FUNC xgetgrnam(const char *name) |
27 | { | ||
28 | struct group *gr = getgrnam(name); | ||
29 | if (!gr) | ||
30 | bb_error_msg_and_die("unknown group %s", name); | ||
31 | return gr; | ||
32 | } | ||
33 | |||
27 | 34 | ||
28 | struct passwd* FAST_FUNC xgetpwuid(uid_t uid) | 35 | struct passwd* FAST_FUNC xgetpwuid(uid_t uid) |
29 | { | 36 | { |
@@ -89,10 +96,7 @@ long FAST_FUNC xgroup2gid(const char *name) | |||
89 | { | 96 | { |
90 | struct group *mygroup; | 97 | struct group *mygroup; |
91 | 98 | ||
92 | mygroup = getgrnam(name); | 99 | mygroup = xgetgrnam(name); |
93 | if (mygroup == NULL) | ||
94 | bb_error_msg_and_die("unknown group %s", name); | ||
95 | |||
96 | return mygroup->gr_gid; | 100 | return mygroup->gr_gid; |
97 | } | 101 | } |
98 | 102 | ||
diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c index 2a840d7c0..5032d7b99 100644 --- a/loginutils/addgroup.c +++ b/loginutils/addgroup.c | |||
@@ -158,10 +158,8 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv) | |||
158 | 158 | ||
159 | /* check if group and user exist */ | 159 | /* check if group and user exist */ |
160 | xuname2uid(argv[0]); /* unknown user: exit */ | 160 | xuname2uid(argv[0]); /* unknown user: exit */ |
161 | xgroup2gid(argv[1]); /* unknown group: exit */ | 161 | gr = xgetgrnam(argv[1]); /* unknown group: exit */ |
162 | // race here! | ||
163 | /* check if user is already in this group */ | 162 | /* check if user is already in this group */ |
164 | gr = getgrnam(argv[1]); | ||
165 | for (; *(gr->gr_mem) != NULL; (gr->gr_mem)++) { | 163 | for (; *(gr->gr_mem) != NULL; (gr->gr_mem)++) { |
166 | if (!strcmp(argv[0], *(gr->gr_mem))) { | 164 | if (!strcmp(argv[0], *(gr->gr_mem))) { |
167 | /* user is already in group: do nothing */ | 165 | /* user is already in group: do nothing */ |