apply five post-1.9.1 patches
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 21 Mar 2008 09:44:02 +0000 (09:44 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 21 Mar 2008 09:44:02 +0000 (09:44 -0000)
editors/patch.c
init/init.c
libbb/lineedit.c
networking/httpd.c
networking/udhcp/files.c

index 07fa5cfaf6f4a61e58f9c09b67d26b9f7b4984ac..1aabaac1530607870ed9b3b824bd3985df5abb6b 100644 (file)
@@ -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) {
index baa5a50009470f6476ae0908f011bd186b4963c9..1bc2aaf9e6324ddd52a46b8bcd83ea14dd8e9cb3 100644 (file)
@@ -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");
index c23fe31073834361ca45a47fb19ade05e2c46fa4..bc64e0305328ef975450a5de275ae4e32af15e2f 100644 (file)
@@ -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);
index b31b7368713b11422e872d243877d3d081bedd5f..3e3be5701dea73a2ea0c46eb589746342757feab 100644 (file)
@@ -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;
index 63c90647d70089afa11a48b982c767cf2193d67b..7736a86caeee338dd7806481e63948b39c5859b5 100644 (file)
@@ -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];