diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-05 22:50:22 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-10-05 22:50:22 +0000 |
| commit | de59c0f58fa5dc75b753f94da61be92bfa0935ec (patch) | |
| tree | fea308471e3d73fb6770ff6e4cda23da53b65bec | |
| parent | 01c27fc5ac89b07821a5430880d771e3c993c1c1 (diff) | |
| download | busybox-w32-de59c0f58fa5dc75b753f94da61be92bfa0935ec.tar.gz busybox-w32-de59c0f58fa5dc75b753f94da61be92bfa0935ec.tar.bz2 busybox-w32-de59c0f58fa5dc75b753f94da61be92bfa0935ec.zip | |
httpd: add -u user[:grp] support
| -rw-r--r-- | coreutils/id.c | 26 | ||||
| -rw-r--r-- | e2fsprogs/ext2fs/version.c | 2 | ||||
| -rw-r--r-- | include/libbb.h | 7 | ||||
| -rw-r--r-- | include/usage.h | 10 | ||||
| -rw-r--r-- | libbb/safe_strncpy.c | 5 | ||||
| -rw-r--r-- | libpwdgrp/Kbuild | 2 | ||||
| -rw-r--r-- | libpwdgrp/uidgid_get.c | 49 | ||||
| -rw-r--r-- | networking/httpd.c | 30 | ||||
| -rw-r--r-- | runit/Kbuild | 2 | ||||
| -rw-r--r-- | runit/chpst.c | 46 | ||||
| -rw-r--r-- | runit/uidgid.c | 63 | ||||
| -rw-r--r-- | runit/uidgid.h | 14 |
12 files changed, 117 insertions, 139 deletions
diff --git a/coreutils/id.c b/coreutils/id.c index 9e49999cd..9d605325c 100644 --- a/coreutils/id.c +++ b/coreutils/id.c | |||
| @@ -29,11 +29,11 @@ | |||
| 29 | static short printf_full(unsigned int id, const char *arg, const char prefix) | 29 | static short printf_full(unsigned int id, const char *arg, const char prefix) |
| 30 | { | 30 | { |
| 31 | const char *fmt = "%cid=%u"; | 31 | const char *fmt = "%cid=%u"; |
| 32 | short status=EXIT_FAILURE; | 32 | short status = EXIT_FAILURE; |
| 33 | 33 | ||
| 34 | if(arg) { | 34 | if (arg) { |
| 35 | fmt = "%cid=%u(%s)"; | 35 | fmt = "%cid=%u(%s)"; |
| 36 | status=EXIT_SUCCESS; | 36 | status = EXIT_SUCCESS; |
| 37 | } | 37 | } |
| 38 | bb_printf(fmt, prefix, id, arg); | 38 | bb_printf(fmt, prefix, id, arg); |
| 39 | return status; | 39 | return status; |
| @@ -60,21 +60,21 @@ int id_main(int argc, char **argv) | |||
| 60 | gid = getgid(); | 60 | gid = getgid(); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | if(argv[optind]) { | 63 | if (argv[optind]) { |
| 64 | p=getpwnam(argv[optind]); | 64 | p = getpwnam(argv[optind]); |
| 65 | /* bb_xgetpwnam is needed because it exits on failure */ | 65 | /* bb_xgetpwnam is needed because it exits on failure */ |
| 66 | uid = bb_xgetpwnam(argv[optind]); | 66 | uid = bb_xgetpwnam(argv[optind]); |
| 67 | gid = p->pw_gid; | 67 | gid = p->pw_gid; |
| 68 | /* in this case PRINT_REAL is the same */ | 68 | /* in this case PRINT_REAL is the same */ |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | if(flags & (JUST_GROUP | JUST_USER)) { | 71 | if (flags & (JUST_GROUP | JUST_USER)) { |
| 72 | /* JUST_GROUP and JUST_USER are mutually exclusive */ | 72 | /* JUST_GROUP and JUST_USER are mutually exclusive */ |
| 73 | if(flags & NAME_NOT_NUMBER) { | 73 | if (flags & NAME_NOT_NUMBER) { |
| 74 | /* bb_getpwuid and bb_getgrgid exit on failure so puts cannot segfault */ | 74 | /* bb_getpwuid and bb_getgrgid exit on failure so puts cannot segfault */ |
| 75 | puts((flags & JUST_USER) ? bb_getpwuid(NULL, uid, -1 ) : bb_getgrgid(NULL, gid, -1 )); | 75 | puts((flags & JUST_USER) ? bb_getpwuid(NULL, uid, -1 ) : bb_getgrgid(NULL, gid, -1 )); |
| 76 | } else { | 76 | } else { |
| 77 | bb_printf("%u\n",(flags & JUST_USER) ? uid : gid); | 77 | bb_printf("%u\n", (flags & JUST_USER) ? uid : gid); |
| 78 | } | 78 | } |
| 79 | /* exit */ | 79 | /* exit */ |
| 80 | bb_fflush_stdout_and_exit(EXIT_SUCCESS); | 80 | bb_fflush_stdout_and_exit(EXIT_SUCCESS); |
| @@ -82,13 +82,13 @@ int id_main(int argc, char **argv) | |||
| 82 | 82 | ||
| 83 | /* Print full info like GNU id */ | 83 | /* Print full info like GNU id */ |
| 84 | /* bb_getpwuid doesn't exit on failure here */ | 84 | /* bb_getpwuid doesn't exit on failure here */ |
| 85 | status=printf_full(uid, bb_getpwuid(NULL, uid, 0), 'u'); | 85 | status = printf_full(uid, bb_getpwuid(NULL, uid, 0), 'u'); |
| 86 | putchar(' '); | 86 | putchar(' '); |
| 87 | /* bb_getgrgid doesn't exit on failure here */ | 87 | /* bb_getgrgid doesn't exit on failure here */ |
| 88 | status|=printf_full(gid, bb_getgrgid(NULL, gid, 0), 'g'); | 88 | status |= printf_full(gid, bb_getgrgid(NULL, gid, 0), 'g'); |
| 89 | 89 | ||
| 90 | #ifdef CONFIG_SELINUX | 90 | #ifdef CONFIG_SELINUX |
| 91 | if ( is_selinux_enabled() ) { | 91 | if (is_selinux_enabled()) { |
| 92 | security_context_t mysid; | 92 | security_context_t mysid; |
| 93 | char context[80]; | 93 | char context[80]; |
| 94 | int len = sizeof(context); | 94 | int len = sizeof(context); |
| @@ -99,8 +99,8 @@ int id_main(int argc, char **argv) | |||
| 99 | len = strlen(mysid)+1; | 99 | len = strlen(mysid)+1; |
| 100 | safe_strncpy(context, mysid, len); | 100 | safe_strncpy(context, mysid, len); |
| 101 | freecon(mysid); | 101 | freecon(mysid); |
| 102 | }else{ | 102 | } else { |
| 103 | safe_strncpy(context, "unknown",8); | 103 | safe_strncpy(context, "unknown", 8); |
| 104 | } | 104 | } |
| 105 | bb_printf(" context=%s", context); | 105 | bb_printf(" context=%s", context); |
| 106 | } | 106 | } |
diff --git a/e2fsprogs/ext2fs/version.c b/e2fsprogs/ext2fs/version.c index 882e121d4..d2981e867 100644 --- a/e2fsprogs/ext2fs/version.c +++ b/e2fsprogs/ext2fs/version.c | |||
| @@ -20,8 +20,6 @@ | |||
| 20 | #include "ext2_fs.h" | 20 | #include "ext2_fs.h" |
| 21 | #include "ext2fs.h" | 21 | #include "ext2fs.h" |
| 22 | 22 | ||
| 23 | //#include "../../version.h" | ||
| 24 | |||
| 25 | static const char *lib_version = E2FSPROGS_VERSION; | 23 | static const char *lib_version = E2FSPROGS_VERSION; |
| 26 | static const char *lib_date = E2FSPROGS_DATE; | 24 | static const char *lib_date = E2FSPROGS_DATE; |
| 27 | 25 | ||
diff --git a/include/libbb.h b/include/libbb.h index ed1d780fd..adfeca590 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
| @@ -291,6 +291,13 @@ extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char pre | |||
| 291 | extern char *bb_getpwuid(char *name, long uid, int bufsize); | 291 | extern char *bb_getpwuid(char *name, long uid, int bufsize); |
| 292 | extern char *bb_getgrgid(char *group, long gid, int bufsize); | 292 | extern char *bb_getgrgid(char *group, long gid, int bufsize); |
| 293 | extern char *bb_askpass(int timeout, const char * prompt); | 293 | extern char *bb_askpass(int timeout, const char * prompt); |
| 294 | /* from chpst */ | ||
| 295 | struct bb_uidgid_t { | ||
| 296 | uid_t uid; | ||
| 297 | gid_t gid; | ||
| 298 | }; | ||
| 299 | extern unsigned uidgid_get(struct bb_uidgid_t*, const char* /*, unsigned*/); | ||
| 300 | |||
| 294 | 301 | ||
| 295 | extern int device_open(const char *device, int mode); | 302 | extern int device_open(const char *device, int mode); |
| 296 | 303 | ||
diff --git a/include/usage.h b/include/usage.h index 34b0566cd..c9e501903 100644 --- a/include/usage.h +++ b/include/usage.h | |||
| @@ -1167,7 +1167,7 @@ USE_FEATURE_DATE_ISOFMT( \ | |||
| 1167 | #define httpd_trivial_usage \ | 1167 | #define httpd_trivial_usage \ |
| 1168 | "[-c <conf file>]" \ | 1168 | "[-c <conf file>]" \ |
| 1169 | USE_FEATURE_HTTPD_WITHOUT_INETD(" [-p <port>]") \ | 1169 | USE_FEATURE_HTTPD_WITHOUT_INETD(" [-p <port>]") \ |
| 1170 | USE_FEATURE_HTTPD_SETUID(" [-u user]") \ | 1170 | USE_FEATURE_HTTPD_SETUID(" [-u user[:grp]]") \ |
| 1171 | USE_FEATURE_HTTPD_BASIC_AUTH(" [-r <realm>]") \ | 1171 | USE_FEATURE_HTTPD_BASIC_AUTH(" [-r <realm>]") \ |
| 1172 | USE_FEATURE_HTTPD_AUTH_MD5(" [-m pass]") \ | 1172 | USE_FEATURE_HTTPD_AUTH_MD5(" [-m pass]") \ |
| 1173 | " [-h home]" \ | 1173 | " [-h home]" \ |
| @@ -1176,12 +1176,12 @@ USE_FEATURE_DATE_ISOFMT( \ | |||
| 1176 | "Listens for incoming http server requests.\n\n" \ | 1176 | "Listens for incoming http server requests.\n\n" \ |
| 1177 | "Options:\n" \ | 1177 | "Options:\n" \ |
| 1178 | "\t-c FILE\t\tSpecifies configuration file. (default httpd.conf)\n" \ | 1178 | "\t-c FILE\t\tSpecifies configuration file. (default httpd.conf)\n" \ |
| 1179 | USE_FEATURE_HTTPD_WITHOUT_INETD("\t-p PORT\tServer port (default 80)\n") \ | 1179 | USE_FEATURE_HTTPD_WITHOUT_INETD("\t-p PORT\t\tServer port (default 80)\n") \ |
| 1180 | USE_FEATURE_HTTPD_SETUID("\t-u USER\tSet uid to USER after listening privileges port\n") \ | 1180 | USE_FEATURE_HTTPD_SETUID("\t-u USER[:GRP]\tSet uid/gid after binding to port\n") \ |
| 1181 | USE_FEATURE_HTTPD_BASIC_AUTH("\t-r REALM\tAuthentication Realm for Basic Authentication\n") \ | 1181 | USE_FEATURE_HTTPD_BASIC_AUTH("\t-r REALM\tAuthentication Realm for Basic Authentication\n") \ |
| 1182 | USE_FEATURE_HTTPD_AUTH_MD5("\t-m PASS\t\tCrypt PASS with md5 algorithm\n") \ | 1182 | USE_FEATURE_HTTPD_AUTH_MD5("\t-m PASS\t\tCrypt PASS with md5 algorithm\n") \ |
| 1183 | "\t-h HOME \tSpecifies http HOME directory (default ./)\n" \ | 1183 | "\t-h HOME\t\tSpecifies http HOME directory (default ./)\n" \ |
| 1184 | "\t-e STRING\tHtml encode STRING\n" \ | 1184 | "\t-e STRING\tHTML encode STRING\n" \ |
| 1185 | "\t-d STRING\tURL decode STRING" | 1185 | "\t-d STRING\tURL decode STRING" |
| 1186 | 1186 | ||
| 1187 | #define hwclock_trivial_usage \ | 1187 | #define hwclock_trivial_usage \ |
diff --git a/libbb/safe_strncpy.c b/libbb/safe_strncpy.c index add92ac9f..42bc16ea0 100644 --- a/libbb/safe_strncpy.c +++ b/libbb/safe_strncpy.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | /* Like strncpy but make sure the resulting string is always 0 terminated. */ | 15 | /* Like strncpy but make sure the resulting string is always 0 terminated. */ |
| 16 | char * safe_strncpy(char *dst, const char *src, size_t size) | 16 | char * safe_strncpy(char *dst, const char *src, size_t size) |
| 17 | { | 17 | { |
| 18 | dst[size-1] = '\0'; | 18 | if (!size) return dst; |
| 19 | return strncpy(dst, src, size-1); | 19 | dst[--size] = '\0'; |
| 20 | return strncpy(dst, src, size); | ||
| 20 | } | 21 | } |
diff --git a/libpwdgrp/Kbuild b/libpwdgrp/Kbuild index 36a6ce393..9e60ef1e5 100644 --- a/libpwdgrp/Kbuild +++ b/libpwdgrp/Kbuild | |||
| @@ -4,4 +4,4 @@ | |||
| 4 | # | 4 | # |
| 5 | # Licensed under the GPL v2, see the file LICENSE in this tarball. | 5 | # Licensed under the GPL v2, see the file LICENSE in this tarball. |
| 6 | 6 | ||
| 7 | lib-y:=pwd_grp.o | 7 | lib-y:=pwd_grp.o uidgid_get.o |
diff --git a/libpwdgrp/uidgid_get.c b/libpwdgrp/uidgid_get.c new file mode 100644 index 000000000..a2d02a84f --- /dev/null +++ b/libpwdgrp/uidgid_get.c | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | #include "busybox.h" | ||
| 2 | |||
| 3 | unsigned uidgid_get(struct bb_uidgid_t *u, const char *ug /*, unsigned dogrp */) | ||
| 4 | { | ||
| 5 | struct passwd *pwd; | ||
| 6 | struct group *gr; | ||
| 7 | const char *g; | ||
| 8 | |||
| 9 | /* g = 0; if (dogrp) g = strchr(ug, ':'); */ | ||
| 10 | g = strchr(ug, ':'); | ||
| 11 | if (g) { | ||
| 12 | int sz = (++g) - ug; | ||
| 13 | char buf[sz]; | ||
| 14 | safe_strncpy(buf, ug, sz); | ||
| 15 | pwd = getpwnam(buf); | ||
| 16 | } else | ||
| 17 | pwd = getpwnam(ug); | ||
| 18 | if (!pwd) | ||
| 19 | return 0; | ||
| 20 | u->uid = pwd->pw_uid; | ||
| 21 | u->gid = pwd->pw_gid; | ||
| 22 | if (g) { | ||
| 23 | gr = getgrnam(g); | ||
| 24 | if (!gr) return 0; | ||
| 25 | u->gid = gr->gr_gid; | ||
| 26 | } | ||
| 27 | return 1; | ||
| 28 | } | ||
| 29 | |||
| 30 | #if 0 | ||
| 31 | #include <stdio.h> | ||
| 32 | int main() | ||
| 33 | { | ||
| 34 | unsigned u; | ||
| 35 | struct bb_uidgid_t ug; | ||
| 36 | u = uidgid_get(&ug, "apache"); | ||
| 37 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | ||
| 38 | ug.uid = ug.gid = 1111; | ||
| 39 | u = uidgid_get(&ug, "apache"); | ||
| 40 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | ||
| 41 | ug.uid = ug.gid = 1111; | ||
| 42 | u = uidgid_get(&ug, "apache:users"); | ||
| 43 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | ||
| 44 | ug.uid = ug.gid = 1111; | ||
| 45 | u = uidgid_get(&ug, "apache:users"); | ||
| 46 | printf("%u = %u:%u\n", u, ug.uid, ug.gid); | ||
| 47 | return 0; | ||
| 48 | } | ||
| 49 | #endif | ||
diff --git a/networking/httpd.c b/networking/httpd.c index ac9eac6bf..8f985774e 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
| @@ -1916,8 +1916,8 @@ int httpd_main(int argc, char *argv[]) | |||
| 1916 | USE_FEATURE_HTTPD_WITHOUT_INETD(const char *s_port;) | 1916 | USE_FEATURE_HTTPD_WITHOUT_INETD(const char *s_port;) |
| 1917 | USE_FEATURE_HTTPD_WITHOUT_INETD(int server;) | 1917 | USE_FEATURE_HTTPD_WITHOUT_INETD(int server;) |
| 1918 | 1918 | ||
| 1919 | USE_FEATURE_HTTPD_SETUID(const char *s_uid;) | 1919 | USE_FEATURE_HTTPD_SETUID(const char *s_ugid = NULL;) |
| 1920 | USE_FEATURE_HTTPD_SETUID(long uid = -1;) | 1920 | USE_FEATURE_HTTPD_SETUID(struct bb_uidgid_t ugid;) |
| 1921 | 1921 | ||
| 1922 | USE_FEATURE_HTTPD_AUTH_MD5(const char *pass;) | 1922 | USE_FEATURE_HTTPD_AUTH_MD5(const char *pass;) |
| 1923 | 1923 | ||
| @@ -1937,7 +1937,7 @@ int httpd_main(int argc, char *argv[]) | |||
| 1937 | USE_FEATURE_HTTPD_ENCODE_URL_STR(, &url_for_encode) | 1937 | USE_FEATURE_HTTPD_ENCODE_URL_STR(, &url_for_encode) |
| 1938 | USE_FEATURE_HTTPD_BASIC_AUTH(, &(config->realm)) | 1938 | USE_FEATURE_HTTPD_BASIC_AUTH(, &(config->realm)) |
| 1939 | USE_FEATURE_HTTPD_AUTH_MD5(, &pass) | 1939 | USE_FEATURE_HTTPD_AUTH_MD5(, &pass) |
| 1940 | USE_FEATURE_HTTPD_SETUID(, &s_uid) | 1940 | USE_FEATURE_HTTPD_SETUID(, &s_ugid) |
| 1941 | USE_FEATURE_HTTPD_WITHOUT_INETD(, &s_port) | 1941 | USE_FEATURE_HTTPD_WITHOUT_INETD(, &s_port) |
| 1942 | ); | 1942 | ); |
| 1943 | 1943 | ||
| @@ -1963,11 +1963,18 @@ int httpd_main(int argc, char *argv[]) | |||
| 1963 | #if ENABLE_FEATURE_HTTPD_SETUID | 1963 | #if ENABLE_FEATURE_HTTPD_SETUID |
| 1964 | if (opt & OPT_SETUID) { | 1964 | if (opt & OPT_SETUID) { |
| 1965 | char *e; | 1965 | char *e; |
| 1966 | 1966 | // FIXME: what the default group should be? | |
| 1967 | uid = strtol(s_uid, &e, 0); | 1967 | ugid.gid = -1; |
| 1968 | ugid.uid = strtoul(s_ugid, &e, 0); | ||
| 1969 | if (*e == ':') { | ||
| 1970 | e++; | ||
| 1971 | ugid.gid = strtoul(e, &e, 0); | ||
| 1972 | } | ||
| 1968 | if (*e != '\0') { | 1973 | if (*e != '\0') { |
| 1969 | /* not integer */ | 1974 | /* not integer */ |
| 1970 | uid = bb_xgetpwnam(s_uid); | 1975 | if (!uidgid_get(&ugid, s_ugid)) |
| 1976 | bb_error_msg_and_die("unrecognized user[:group] " | ||
| 1977 | "name '%s'", s_ugid); | ||
| 1971 | } | 1978 | } |
| 1972 | } | 1979 | } |
| 1973 | #endif | 1980 | #endif |
| @@ -1978,8 +1985,15 @@ int httpd_main(int argc, char *argv[]) | |||
| 1978 | server = openServer(); | 1985 | server = openServer(); |
| 1979 | # ifdef CONFIG_FEATURE_HTTPD_SETUID | 1986 | # ifdef CONFIG_FEATURE_HTTPD_SETUID |
| 1980 | /* drop privileges */ | 1987 | /* drop privileges */ |
| 1981 | if (uid > 0) | 1988 | if (opt & OPT_SETUID) { |
| 1982 | xsetuid(uid); | 1989 | if (ugid.gid != (gid_t)-1) { |
| 1990 | // FIXME: needed? | ||
| 1991 | //if (setgroups(1, &ugid.gid) == -1) | ||
| 1992 | // bb_perror_msg_and_die("setgroups"); | ||
| 1993 | xsetgid(ugid.gid); | ||
| 1994 | } | ||
| 1995 | xsetuid(ugid.uid); | ||
| 1996 | } | ||
| 1983 | # endif | 1997 | # endif |
| 1984 | #endif | 1998 | #endif |
| 1985 | 1999 | ||
diff --git a/runit/Kbuild b/runit/Kbuild index 9fee84224..39a9b0229 100644 --- a/runit/Kbuild +++ b/runit/Kbuild | |||
| @@ -5,4 +5,4 @@ | |||
| 5 | # Licensed under the GPL v2, see the file LICENSE in this tarball. | 5 | # Licensed under the GPL v2, see the file LICENSE in this tarball. |
| 6 | 6 | ||
| 7 | lib-y:= | 7 | lib-y:= |
| 8 | lib-$(CONFIG_CHPST) += chpst.o uidgid.o | 8 | lib-$(CONFIG_CHPST) += chpst.o |
diff --git a/runit/chpst.c b/runit/chpst.c index 1ee9b8d0f..da2f270e2 100644 --- a/runit/chpst.c +++ b/runit/chpst.c | |||
| @@ -1,16 +1,9 @@ | |||
| 1 | #include "busybox.h" | 1 | #include "busybox.h" |
| 2 | 2 | ||
| 3 | #include <sys/types.h> | ||
| 4 | #include <sys/resource.h> | ||
| 5 | #include <grp.h> | ||
| 6 | |||
| 7 | #include "uidgid.h" | ||
| 8 | |||
| 9 | #include <sys/types.h> | ||
| 10 | #include <dirent.h> | 3 | #include <dirent.h> |
| 11 | 4 | ||
| 12 | static unsigned option_mask; | 5 | static unsigned option_mask; |
| 13 | // Must meatch constants in chpst_main! | 6 | // Must match constants in chpst_main! |
| 14 | #define OPT_verbose (option_mask & 0x2000) | 7 | #define OPT_verbose (option_mask & 0x2000) |
| 15 | #define OPT_pgrp (option_mask & 0x4000) | 8 | #define OPT_pgrp (option_mask & 0x4000) |
| 16 | #define OPT_nostdin (option_mask & 0x8000) | 9 | #define OPT_nostdin (option_mask & 0x8000) |
| @@ -33,34 +26,27 @@ static long limitt = -2; | |||
| 33 | static long nicelvl; | 26 | static long nicelvl; |
| 34 | static const char *root; | 27 | static const char *root; |
| 35 | 28 | ||
| 36 | static void suidgid(char *user, unsigned dogrp) | 29 | static void suidgid(char *user) |
| 37 | { | 30 | { |
| 38 | struct uidgid ugid; | 31 | struct bb_uidgid_t ugid; |
| 39 | 32 | ||
| 40 | if (!uidgid_get(&ugid, user, dogrp)) { | 33 | if (!uidgid_get(&ugid, user)) { |
| 41 | if (dogrp) | 34 | bb_error_msg_and_die("unknown user/group: %s", user); |
| 42 | bb_error_msg_and_die("unknown user/group: %s", user); | ||
| 43 | else | ||
| 44 | bb_error_msg_and_die("unknown account: %s", user); | ||
| 45 | } | 35 | } |
| 46 | if (setgroups(ugid.gids, ugid.gid) == -1) | 36 | if (setgroups(1, &ugid.gid) == -1) |
| 47 | bb_perror_msg_and_die("setgroups"); | 37 | bb_perror_msg_and_die("setgroups"); |
| 48 | xsetgid(*ugid.gid); | 38 | xsetgid(ugid.gid); |
| 49 | xsetuid(ugid.uid); | 39 | xsetuid(ugid.uid); |
| 50 | } | 40 | } |
| 51 | 41 | ||
| 52 | static void euidgid(char *user, unsigned dogrp) | 42 | static void euidgid(char *user) |
| 53 | { | 43 | { |
| 54 | struct uidgid ugid; | 44 | struct bb_uidgid_t ugid; |
| 55 | 45 | ||
| 56 | if (!uidgid_get(&ugid, user, dogrp)) { | 46 | if (!uidgid_get(&ugid, user)) { |
| 57 | if (dogrp) | 47 | bb_error_msg_and_die("unknown user/group: %s", user); |
| 58 | bb_error_msg_and_die("unknown user/group: %s", user); | ||
| 59 | else | ||
| 60 | bb_error_msg_and_die("unknown account: %s", user); | ||
| 61 | } | 48 | } |
| 62 | //FIXME: ultoa needed here! | 49 | xsetenv("GID", utoa(ugid.gid)); |
| 63 | xsetenv("GID", utoa(*ugid.gid)); | ||
| 64 | xsetenv("UID", utoa(ugid.uid)); | 50 | xsetenv("UID", utoa(ugid.uid)); |
| 65 | } | 51 | } |
| 66 | 52 | ||
| @@ -276,8 +262,8 @@ int chpst_main(int argc, char **argv) | |||
| 276 | if (nice(nicelvl) == -1) | 262 | if (nice(nicelvl) == -1) |
| 277 | bb_perror_msg_and_die("nice"); | 263 | bb_perror_msg_and_die("nice"); |
| 278 | } | 264 | } |
| 279 | if (env_user) euidgid(env_user, 1); | 265 | if (env_user) euidgid(env_user); |
| 280 | if (set_user) suidgid(set_user, 1); | 266 | if (set_user) suidgid(set_user); |
| 281 | if (OPT_nostdin) close(0); | 267 | if (OPT_nostdin) close(0); |
| 282 | if (OPT_nostdout) close(1); | 268 | if (OPT_nostdout) close(1); |
| 283 | if (OPT_nostderr) close(2); | 269 | if (OPT_nostderr) close(2); |
| @@ -292,7 +278,7 @@ static void setuidgid(int argc, char **argv) | |||
| 292 | account = *++argv; | 278 | account = *++argv; |
| 293 | if (!account) bb_show_usage(); | 279 | if (!account) bb_show_usage(); |
| 294 | if (!*++argv) bb_show_usage(); | 280 | if (!*++argv) bb_show_usage(); |
| 295 | suidgid((char*)account, 0); | 281 | suidgid((char*)account); |
| 296 | execvp(argv[0], argv); | 282 | execvp(argv[0], argv); |
| 297 | bb_perror_msg_and_die("exec %s", argv[0]); | 283 | bb_perror_msg_and_die("exec %s", argv[0]); |
| 298 | } | 284 | } |
| @@ -304,7 +290,7 @@ static void envuidgid(int argc, char **argv) | |||
| 304 | account = *++argv; | 290 | account = *++argv; |
| 305 | if (!account) bb_show_usage(); | 291 | if (!account) bb_show_usage(); |
| 306 | if (!*++argv) bb_show_usage(); | 292 | if (!*++argv) bb_show_usage(); |
| 307 | euidgid((char*)account, 0); | 293 | euidgid((char*)account); |
| 308 | execvp(argv[0], argv); | 294 | execvp(argv[0], argv); |
| 309 | bb_perror_msg_and_die("exec %s", argv[0]); | 295 | bb_perror_msg_and_die("exec %s", argv[0]); |
| 310 | } | 296 | } |
diff --git a/runit/uidgid.c b/runit/uidgid.c deleted file mode 100644 index a8fec409d..000000000 --- a/runit/uidgid.c +++ /dev/null | |||
| @@ -1,63 +0,0 @@ | |||
| 1 | #include <sys/types.h> | ||
| 2 | #include <pwd.h> | ||
| 3 | #include <grp.h> | ||
| 4 | #include "uidgid.h" | ||
| 5 | |||
| 6 | static unsigned str_chr(const char *s, int c) | ||
| 7 | { | ||
| 8 | const char *t = s; | ||
| 9 | while (t[0] && t[0] != (char)c) | ||
| 10 | t++; | ||
| 11 | return t - s; | ||
| 12 | } | ||
| 13 | |||
| 14 | |||
| 15 | unsigned uidgid_get(struct uidgid *u, char *ug, unsigned dogrp) { | ||
| 16 | char *g = 0; | ||
| 17 | struct passwd *pwd = 0; | ||
| 18 | struct group *gr = 0; | ||
| 19 | int i, d = 0; | ||
| 20 | |||
| 21 | if (dogrp) | ||
| 22 | d = str_chr(ug, ':'); | ||
| 23 | if (ug[d] == ':') { | ||
| 24 | ug[d] = 0; | ||
| 25 | g = ug + d + 1; | ||
| 26 | } | ||
| 27 | pwd = getpwnam(ug); | ||
| 28 | if (!pwd) { | ||
| 29 | if (g) ug[d] = ':'; | ||
| 30 | return 0; | ||
| 31 | } | ||
| 32 | if (g) { | ||
| 33 | ug[d] = ':'; | ||
| 34 | for (i = 0; i < 60; ++i) { | ||
| 35 | d = str_chr(g, ':'); | ||
| 36 | if (g[d] == ':') { | ||
| 37 | g[d] = 0; | ||
| 38 | gr = getgrnam(g); | ||
| 39 | if (!gr) { | ||
| 40 | g[d] = ':'; | ||
| 41 | return 0; | ||
| 42 | } | ||
| 43 | g[d] = ':'; | ||
| 44 | u->gid[i] = gr->gr_gid; | ||
| 45 | g += d+1; | ||
| 46 | } | ||
| 47 | else { | ||
| 48 | gr = getgrnam(g); | ||
| 49 | if (!gr) return 0; | ||
| 50 | u->gid[i++] = gr->gr_gid; | ||
| 51 | break; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | u->gid[i] = 0; | ||
| 55 | u->gids = i; | ||
| 56 | } | ||
| 57 | if (!g) { | ||
| 58 | u->gid[0] = pwd->pw_gid; | ||
| 59 | u->gids = 1; | ||
| 60 | } | ||
| 61 | u->uid = pwd->pw_uid; | ||
| 62 | return 1; | ||
| 63 | } | ||
diff --git a/runit/uidgid.h b/runit/uidgid.h deleted file mode 100644 index 1d47fe620..000000000 --- a/runit/uidgid.h +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | #ifndef UIDGID_H | ||
| 2 | #define UIDGID_H | ||
| 3 | |||
| 4 | #include <sys/types.h> | ||
| 5 | |||
| 6 | struct uidgid { | ||
| 7 | uid_t uid; | ||
| 8 | gid_t gid[61]; | ||
| 9 | int gids; | ||
| 10 | }; | ||
| 11 | |||
| 12 | extern unsigned uidgid_get(struct uidgid *, char *, unsigned); | ||
| 13 | |||
| 14 | #endif | ||
