lineedit: nuke two unused variables and code which sets them applets: do not even try to read config if run by real root msh: use named constants (O_RDONLY etc) in open() instead of magic numbers, other minor code size reduction.
No binary (build failed)
—
(log yok)
| @@ -48,14 +48,15 @@ static const char usage_messages[] = "" | |
| /* The -1 arises because of the {0,NULL,0,-1} entry. */ | |
| const unsigned short NUM_APPLETS = sizeof(applets) / sizeof(applets[0]) - 1; | |
| - | |
| const struct bb_applet *current_applet; | |
| const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE; | |
| #if !BB_MMU | |
| bool re_execed; | |
| #endif | |
| - | |
| + | #if ENABLE_FEATURE_SUID |
| + | static uid_t ruid; /* real uid */ |
| + | #endif |
| #if ENABLE_FEATURE_SUID_CONFIG | |
| @@ -143,6 +144,10 @@ static void parse_config_file(void) | |
| assert(!suid_config); /* Should be set to NULL by bss init. */ | |
| + | ruid = getuid(); |
| + | if (ruid == 0) /* run by root - don't need to even read config file */ |
| + | return; |
| + | |
| if ((stat(config_file, &st) != 0) /* No config file? */ | |
| || !S_ISREG(st.st_mode) /* Not a regular file? */ | |
| || (st.st_uid != 0) /* Not owned by root? */ | |
| @@ -324,15 +329,21 @@ static void parse_config_file(void) | |
| } | |
| } | |
| #else | |
| - | #define parse_config_file() ((void)0) |
| + | static inline void parse_config_file(void) |
| + | { |
| + | ruid = getuid(); |
| + | } |
| #endif /* FEATURE_SUID_CONFIG */ | |
| #if ENABLE_FEATURE_SUID | |
| static void check_suid(const struct bb_applet *applet) | |
| { | |
| - | uid_t ruid = getuid(); /* real [ug]id */ |
| - | uid_t rgid = getgid(); |
| + | uid_t rgid; /* real gid */ |
| + | |
| + | if (ruid == 0) /* set by parse_config_file() */ |
| + | return; /* run by root - no need to check more */ |
| + | rgid = getgid(); |
| #if ENABLE_FEATURE_SUID_CONFIG | |
| if (suid_cfg_readable) { | |
| @@ -387,7 +398,7 @@ static void check_suid(const struct bb_applet *applet) | |
| if (geteuid()) | |
| bb_error_msg_and_die("applet requires root privileges!"); | |
| } else if (applet->need_suid == _BB_SUID_NEVER) { | |
| - | xsetgid(rgid); /* drop all privileges */ |
| + | xsetgid(rgid); /* drop all privileges */ |
| xsetuid(ruid); | |
| } | |
| } | |
| @@ -636,8 +647,7 @@ int main(int argc, char **argv) | |
| if (s) | |
| applet_name = s + 1; | |
| - | if (ENABLE_FEATURE_SUID_CONFIG) |
| - | parse_config_file(); |
| + | parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ |
| /* Set locale for everybody except 'init' */ | |
| if (ENABLE_LOCALE_SUPPORT && getpid() != 1) | |
| @@ -85,11 +85,6 @@ static char *user_buf = (char*)""; | |
| static char *home_pwd_buf = (char*)""; | |
| #endif | |
| - | #if ENABLE_FEATURE_TAB_COMPLETION |
| - | static int my_uid; |
| - | static int my_gid; |
| - | #endif |
| - | |
| /* Put 'command_ps[cursor]', cursor++. | |
| * Advance cursor on screen. If we reached right margin, scroll text up | |
| * and remove terminal margin effect by printing 'next_char' */ | |
| @@ -1311,10 +1306,6 @@ int read_line_input(const char* prompt, char* command, int maxsize, line_input_t | |
| home_pwd_buf = xstrdup(entry->pw_dir); | |
| } | |
| } | |
| - | #endif |
| - | #if ENABLE_FEATURE_TAB_COMPLETION |
| - | my_uid = getuid(); |
| - | my_gid = getgid(); |
| #endif | |
| /* Print out the command prompt */ | |
| parse_prompt(prompt); | |
| @@ -152,16 +152,15 @@ int mshdbg_rc = 0; | |
| /* | |
| * values returned by wait | |
| */ | |
| - | #define WAITSIG(s) ((s)&0177) |
| - | #define WAITVAL(s) (((s)>>8)&0377) |
| - | #define WAITCORE(s) (((s)&0200)!=0) |
| + | #define WAITSIG(s) ((s) & 0177) |
| + | #define WAITVAL(s) (((s) >> 8) & 0377) |
| + | #define WAITCORE(s) (((s) & 0200) != 0) |
| /* | |
| * library and system definitions | |
| */ | |
| typedef void xint; /* base type of jmp_buf, for not broken compilers */ | |
| - | |
| /* | |
| * shell components | |
| */ | |
| @@ -170,7 +169,6 @@ typedef void xint; /* base type of jmp_buf, for not broken compilers */ | |
| #define NOWORDS ((char **)NULL) | |
| #define NOPIPE ((int *)NULL) | |
| - | |
| /* | |
| * redirection | |
| */ | |
| @@ -250,21 +248,20 @@ static const char *const T_CMD_NAMES[] = { | |
| /* | |
| * actions determining the environment of a process | |
| */ | |
| - | #define BIT(i) (1<<(i)) |
| - | #define FEXEC BIT(0) /* execute without forking */ |
| + | #define FEXEC 1 /* execute without forking */ |
| - | #define AREASIZE (90000) |
| + | #define AREASIZE (90000) |
| /* | |
| * flags to control evaluation of words | |
| */ | |
| - | #define DOSUB 1 /* interpret $, `, and quotes */ |
| - | #define DOBLANK 2 /* perform blank interpretation */ |
| - | #define DOGLOB 4 /* interpret [?* */ |
| - | #define DOKEY 8 /* move words with `=' to 2nd arg. list */ |
| - | #define DOTRIM 16 /* trim resulting string */ |
| + | #define DOSUB 1 /* interpret $, `, and quotes */ |
| + | #define DOBLANK 2 /* perform blank interpretation */ |
| + | #define DOGLOB 4 /* interpret [?* */ |
| + | #define DOKEY 8 /* move words with `=' to 2nd arg. list */ |
| + | #define DOTRIM 16 /* trim resulting string */ |
| - | #define DOALL (DOSUB|DOBLANK|DOGLOB|DOKEY|DOTRIM) |
| + | #define DOALL (DOSUB|DOBLANK|DOGLOB|DOKEY|DOTRIM) |
| /* PROTOTYPES */ | |
| @@ -333,13 +330,13 @@ static void runtrap(int i); | |
| /* -------- area stuff -------- */ | |
| - | #define REGSIZE sizeof(struct region) |
| - | #define GROWBY (256) |
| - | /* #define SHRINKBY (64) */ |
| - | #undef SHRINKBY |
| - | #define FREE (32767) |
| - | #define BUSY (0) |
| - | #define ALIGN (sizeof(int)-1) |
| + | #define REGSIZE sizeof(struct region) |
| + | #define GROWBY (256) |
| + | /* #define SHRINKBY (64) */ |
| + | #undef SHRINKBY |
| + | #define FREE (32767) |
| + | #define BUSY (0) |
| + | #define ALIGN (sizeof(int)-1) |
| struct region { | |
| @@ -1313,7 +1310,7 @@ static int newfile(char *s) | |
| f = 0; | |
| if (NOT_LONE_DASH(s)) { | |
| DBGPRINTF(("NEWFILE: s is %s\n", s)); | |
| - | f = open(s, 0); |
| + | f = open(s, O_RDONLY); |
| if (f < 0) { | |
| prs(s); | |
| err(": cannot open"); | |
| @@ -2554,7 +2551,7 @@ static int execute(struct op *t, int *pin, int *pout, int act) | |
| interactive = 0; | |
| if (pin == NULL) { | |
| close(0); | |
| - | open(bb_dev_null, 0); |
| + | open(bb_dev_null, O_RDONLY); |
| } | |
| _exit(execute(t->left, pin, pout, FEXEC)); | |
| } | |
| @@ -2734,7 +2731,8 @@ static int forkexec(struct op *t, int *pin, int *pout, int act, char **wp) | |
| resetsig = 0; | |
| rv = -1; /* system-detected error */ | |
| if (t->type == TCOM) { | |
| - | while (*wp++ != NULL); |
| + | while (*wp++ != NULL) |
| + | continue; |
| cp = *wp; | |
| /* strip all initial assignments */ | |
| @@ -2747,7 +2745,7 @@ static int forkexec(struct op *t, int *pin, int *pout, int act, char **wp) | |
| if (cp == NULL && t->ioact == NULL) { | |
| while ((cp = *owp++) != NULL && assign(cp, COPYV)) | |
| - | /**/; |
| + | continue; |
| DBGPRINTF(("FORKEXEC: returning setstatus()\n")); | |
| return setstatus(0); | |
| } | |
| @@ -2932,7 +2930,7 @@ static int iosetup(struct ioword *iop, int pipein, int pipeout) | |
| } | |
| switch (iop->io_flag) { | |
| case IOREAD: | |
| - | u = open(cp, 0); |
| + | u = open(cp, O_RDONLY); |
| break; | |
| case IOHERE: | |
| @@ -2942,7 +2940,7 @@ static int iosetup(struct ioword *iop, int pipein, int pipeout) | |
| break; | |
| case IOWRITE | IOCAT: | |
| - | u = open(cp, 1); |
| + | u = open(cp, O_WRONLY); |
| if (u >= 0) { | |
| lseek(u, (long) 0, SEEK_END); | |
| break; | |
| @@ -3346,7 +3344,7 @@ static int dodot(struct op *t) | |
| for (i = 0; (*tp++ = cp[i++]) != '\0';); | |
| /* Original code */ | |
| - | i = open(e.linep, 0); |
| + | i = open(e.linep, O_RDONLY); |
| if (i >= 0) { | |
| exstat = 0; | |
| maltmp = remap(i); | |
| @@ -5098,7 +5096,7 @@ static int herein(char *hname, int xdoll) | |
| DBGPRINTF7(("HEREIN: hname is %s, xdoll=%d\n", hname, xdoll)); | |
| - | hf = open(hname, 0); |
| + | hf = open(hname, O_RDONLY); |
| if (hf < 0) | |
| return -1; | |
| @@ -5122,7 +5120,7 @@ static int herein(char *hname, int xdoll) | |
| } else | |
| unlink(tname); | |
| close(tf); | |
| - | tf = open(tname, 0); |
| + | tf = open(tname, O_RDONLY); |
| unlink(tname); | |
| return tf; | |
| } | |
| @@ -5214,10 +5212,11 @@ int msh_main(int argc, char **argv) | |
| path = lookup("PATH"); | |
| if (path->value == null) { | |
| + | /* Can be merged with same string elsewhere in bbox */ |
| if (geteuid() == 0) | |
| - | setval(path, "/sbin:/bin:/usr/sbin:/usr/bin"); |
| + | setval(path, "/sbin:/usr/sbin:/bin:/usr/bin"); |
| else | |
| - | setval(path, "/bin:/usr/bin"); |
| + | setval(path, "/sbin:/usr/sbin:/bin:/usr/bin" + sizeof("/sbin:/usr/sbin")); |
| } | |
| export(path); | |
| @@ -5329,10 +5328,10 @@ int msh_main(int argc, char **argv) | |
| signal(SIGQUIT, qflag); | |
| if (name && name[0] == '-') { | |
| interactive++; | |
| - | f = open(".profile", 0); |
| + | f = open(".profile", O_RDONLY); |
| if (f >= 0) | |
| next(remap(f)); | |
| - | f = open("/etc/profile", 0); |
| + | f = open("/etc/profile", O_RDONLY); |
| if (f >= 0) | |
| next(remap(f)); | |
| } | |