From: Denis Vlasenko Date: Fri, 21 Mar 2008 09:44:02 +0000 (-0000) Subject: apply five post-1.9.1 patches X-Git-Tag: 1_9_2~2 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=77d390dc7061c7f71ee69ed819a4c2aec4779109;p=oweals%2Fbusybox.git apply five post-1.9.1 patches --- diff --git a/editors/patch.c b/editors/patch.c index 07fa5cfaf..1aabaac15 100644 --- a/editors/patch.c +++ b/editors/patch.c @@ -71,12 +71,6 @@ static char *extract_filename(char *line, int patch_level) return xstrdup(filename_start_ptr); } -static int file_doesnt_exist(const char *filename) -{ - struct stat statbuf; - return stat(filename, &statbuf); -} - int patch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int patch_main(int argc, char **argv) { @@ -84,7 +78,8 @@ int patch_main(int argc, char **argv) char *patch_line; int ret; FILE *patch_file = NULL; - + struct stat saved_stat; + { char *p, *i; ret = getopt32(argv, "p:i:", &p, &i); @@ -134,8 +129,9 @@ int patch_main(int argc, char **argv) } new_filename = extract_filename(patch_line, patch_level); free(patch_line); - - if (file_doesnt_exist(new_filename)) { + + /* Get access rights from the file to be patched, -1 file does not exist */ + if (stat(new_filename, &saved_stat)) { char *line_ptr; /* Create leading directories */ line_ptr = strrchr(new_filename, '/'); @@ -155,9 +151,10 @@ int patch_main(int argc, char **argv) backup_filename); } dst_stream = xfopen(new_filename, "w"); + fchmod(fileno(dst_stream), saved_stat.st_mode); } - if ((backup_filename == NULL) || file_doesnt_exist(original_filename)) { + if ((backup_filename == NULL) || stat(original_filename, &saved_stat)) { src_stream = NULL; } else { if (strcmp(original_filename, new_filename) == 0) { diff --git a/init/init.c b/init/init.c index baa5a5000..1bc2aaf9e 100644 --- a/init/init.c +++ b/init/init.c @@ -225,8 +225,22 @@ static void console_init(void) } messageD(L_LOG, "console='%s'", s); } else { - /* Make sure fd 0,1,2 are not closed */ - bb_sanitize_stdio(); + /* Make sure fd 0,1,2 are not closed + * (so that they won't be used by future opens) */ + + /* bb_sanitize_stdio(); - WRONG. + * Fail if "/dev/null" doesnt exist, and for init + * this is a real possibility! Open code it instead. */ + + int fd = open(bb_dev_null, O_RDWR); + if (fd < 0) { + /* Give me _ANY_ open descriptor! */ + fd = xopen("/", O_RDONLY); /* we don't believe this can fail */ + } + while ((unsigned)fd < 2) + fd = dup(fd); + if (fd > 2) + close (fd); } s = getenv("TERM"); diff --git a/libbb/lineedit.c b/libbb/lineedit.c index c23fe3107..bc64e0305 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -246,7 +246,15 @@ static void input_backward(unsigned num) if (cmdedit_x >= num) { cmdedit_x -= num; if (num <= 4) { - printf("\b\b\b\b" + (4-num)); + /* This is longer by 5 bytes on x86. + * Also gets mysteriously + * miscompiled for some ARM users. + * printf(("\b\b\b\b" + 4) - num); + * return; + */ + do { + bb_putchar('\b'); + } while (--num); return; } printf("\033[%uD", num); diff --git a/networking/httpd.c b/networking/httpd.c index b31b73687..3e3be5701 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -1950,7 +1950,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr) if ((STRNCASECMP(iobuf, "Content-length:") == 0)) { /* extra read only for POST */ if (prequest != request_GET) { - tptr = iobuf + sizeof("Content-length:") - 1; + tptr = tptr = skip_whitespace(iobuf + sizeof("Content-length:") - 1); if (!tptr[0]) send_headers_and_exit(HTTP_BAD_REQUEST); errno = 0; diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 63c90647d..7736a86ca 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -167,7 +167,7 @@ static int read_opt(const char *const_line, void *arg) if (!opt) return 0; - idx = index_in_strings(opt, dhcp_option_strings); /* NB: was strcasecmp! */ + idx = index_in_strings(dhcp_option_strings, opt); /* NB: was strcasecmp! */ if (idx < 0) return 0; option = &dhcp_options[idx];