apply post-1.18.1 patches, bump version to 1.18.2 1_18_2
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 16 Jan 2011 19:00:24 +0000 (20:00 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 16 Jan 2011 19:00:24 +0000 (20:00 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Makefile
archival/bzip2.c
archival/cpio.c
archival/libarchive/bz/bzlib.c
libbb/procps.c
modutils/modprobe-small.c
networking/httpd.c
networking/tftp.c
shell/hush.c
util-linux/mkswap.c

index f690ff4f262ae686536091ba091097b410cbd710..e8bead003b50e39f56fde49791823498de31c01b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 18
-SUBLEVEL = 1
+SUBLEVEL = 2
 EXTRAVERSION =
 NAME = Unnamed
 
index a6abc931c114c069c89a65fe523e490eb2cf6c8b..ab08ffc1a91e1229591d5a9e423fa2ec4ce1dd3c 100644 (file)
@@ -128,10 +128,12 @@ IF_DESKTOP(long long) int FAST_FUNC compressStream(unpack_info_t *info UNUSED_PA
                        break;
        }
 
-#if ENABLE_FEATURE_CLEAN_UP
+       /* Can't be conditional on ENABLE_FEATURE_CLEAN_UP -
+        * we are called repeatedly
+        */
        BZ2_bzCompressEnd(strm);
        free(iobuf);
-#endif
+
        return total;
 }
 
index 6ab2688212c9e9f8822fb782fb5625cf621dc9ca..9fa8badc53ac051073165fdc410087c489a26e09 100644 (file)
@@ -308,16 +308,12 @@ int cpio_main(int argc UNUSED_PARAM, char **argv)
        /* -L makes sense only with -o or -p */
 
 #if !ENABLE_FEATURE_CPIO_O
-       /* no parameters */
-       opt_complementary = "=0";
        opt = getopt32(argv, OPTION_STR, &cpio_filename);
        argv += optind;
        if (opt & CPIO_OPT_FILE) { /* -F */
                xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO);
        }
 #else
-       /* _exactly_ one parameter for -p, thus <= 1 param if -p is allowed */
-       opt_complementary = ENABLE_FEATURE_CPIO_P ? "?1" : "=0";
        opt = getopt32(argv, OPTION_STR "oH:" IF_FEATURE_CPIO_P("p"), &cpio_filename, &cpio_fmt);
        argv += optind;
        if ((opt & (CPIO_OPT_FILE|CPIO_OPT_CREATE)) == CPIO_OPT_FILE) { /* -F without -o */
index b3beeabed83e7c6e5d9f8f91829f839406636392..5f7db747aecf2a2f852cb63d2ec7f6db116659a6 100644 (file)
@@ -361,7 +361,6 @@ int BZ2_bzCompress(bz_stream *strm, int action)
 
 
 /*---------------------------------------------------*/
-#if ENABLE_FEATURE_CLEAN_UP
 static
 void BZ2_bzCompressEnd(bz_stream *strm)
 {
@@ -372,9 +371,8 @@ void BZ2_bzCompressEnd(bz_stream *strm)
        free(s->arr2);
        free(s->ftab);
        free(s->crc32table);
-       free(strm->state);
+       free(s);
 }
-#endif
 
 
 /*---------------------------------------------------*/
index 7924660481f022c4d045ead812748528bd6f6cc8..33932a3a3b71bbfd41b2a6d50316a7af4286b168 100644 (file)
@@ -154,6 +154,7 @@ static unsigned long fast_strtoul_10(char **endptr)
        return n;
 }
 
+# if ENABLE_FEATURE_FAST_TOP
 static long fast_strtol_10(char **endptr)
 {
        if (**endptr != '-')
@@ -162,6 +163,7 @@ static long fast_strtol_10(char **endptr)
        (*endptr)++;
        return - (long)fast_strtoul_10(endptr);
 }
+# endif
 
 static char *skip_fields(char *str, int count)
 {
@@ -448,7 +450,7 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags)
 //FIXME: is it safe to assume this field exists?
                        sp->last_seen_on_cpu = fast_strtoul_10(&cp);
 # endif
-#endif /* end of !ENABLE_FEATURE_TOP_SMP_PROCESS */
+#endif /* FEATURE_FAST_TOP */
 
 #if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
                        sp->niceness = tasknice;
index ec3ddfb8f4369f683c9ba4db5020a78a8b28c0a1..f4f17e766385d256a5a6ed0995613ffb997eb8be 100644 (file)
@@ -844,13 +844,15 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
                void *map;
 
                len = MAXINT(ssize_t);
-               map = xmalloc_xopen_read_close(*argv, &len);
+               map = xmalloc_open_zipped_read_close(*argv, &len);
                if (init_module(map, len,
                        IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(options ? options : "")
                        IF_NOT_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE("")
-                               ) != 0)
+                       ) != 0
+               ) {
                        bb_error_msg_and_die("can't insert '%s': %s",
                                        *argv, moderror(errno));
+               }
                return 0;
        }
 
index fa42d98506708944d0c33452f51f25aaadd892f1..b8113a8431ee3702b28c4ed17af194d2bdbb2ba4 100644 (file)
@@ -1522,6 +1522,7 @@ static NOINLINE void send_file_and_exit(const char *url, int what)
                        struct stat sb;
                        fstat(fd, &sb);
                        file_size = sb.st_size;
+                       last_mod = sb.st_mtime;
                } else {
                        IF_FEATURE_HTTPD_GZIP(content_gzip = 0;)
                        fd = open(url, O_RDONLY);
index 04c8f0ebba19d95571440401c5633b1952af39a5..fcd933f6ad76adcd416b347faa6fa6eb3a7032b1 100644 (file)
@@ -105,39 +105,22 @@ struct BUG_G_too_big {
 #define error_pkt_str    (error_pkt + 4)
 
 #if ENABLE_FEATURE_TFTP_PROGRESS_BAR
-/* SIGALRM logic nicked from the wget applet */
-static void progress_meter(int flag)
+static void tftp_progress_update(void)
 {
-       /* We can be called from signal handler */
-       int save_errno = errno;
-
-       if (flag == -1) { /* first call to progress_meter */
-               bb_progress_init(&G.pmt);
-       }
-
        bb_progress_update(&G.pmt, G.file, 0, G.pos, G.size);
-
-       if (flag == 0) {
-               /* last call to progress_meter */
-               alarm(0);
-               bb_putchar_stderr('\n');
-       } else {
-               if (flag == -1) { /* first call to progress_meter */
-                       signal_SA_RESTART_empty_mask(SIGALRM, progress_meter);
-               }
-               alarm(1);
-       }
-
-       errno = save_errno;
 }
 static void tftp_progress_init(void)
 {
-       progress_meter(-1);
+       bb_progress_init(&G.pmt);
+       tftp_progress_update();
 }
 static void tftp_progress_done(void)
 {
-       if (G.pmt.inited)
-               progress_meter(0);
+       if (G.pmt.inited) {
+               tftp_progress_update();
+               bb_putchar_stderr('\n');
+               G.pmt.inited = 0;
+       }
 }
 #else
 # define tftp_progress_init() ((void)0)
@@ -460,9 +443,10 @@ static int tftp_protocol(
                xsendto(socket_fd, xbuf, send_len, &peer_lsa->u.sa, peer_lsa->len);
 
 #if ENABLE_FEATURE_TFTP_PROGRESS_BAR
-               if (ENABLE_TFTP && remote_file) /* tftp */
+               if (ENABLE_TFTP && remote_file) /* tftp */
                        G.pos = (block_nr - 1) * (uoff_t)blksize;
-               }
+               if (G.pmt.inited)
+                       tftp_progress_update();
 #endif
                /* Was it final ACK? then exit */
                if (finished && (opcode == TFTP_ACK))
@@ -479,6 +463,7 @@ static int tftp_protocol(
                case 0:
                        retries--;
                        if (retries == 0) {
+                               tftp_progress_done();
                                bb_error_msg("timeout");
                                goto ret; /* no err packet sent */
                        }
index fa7e4f563958d264d6f525faacdbb774a9d70f1e..f9f815289f63be29cecbb5fdfc66f89cf863a01e 100644 (file)
@@ -913,7 +913,7 @@ static const struct built_in_command bltins2[] = {
  */
 #if HUSH_DEBUG
 /* prevent disasters with G.debug_indent < 0 */
-# define indent() fprintf(stderr, "%*s", (G.debug_indent * 2) & 0xff, "")
+# define indent() fdprintf(2, "%*s", (G.debug_indent * 2) & 0xff, "")
 # define debug_enter() (G.debug_indent++)
 # define debug_leave() (G.debug_indent--)
 #else
@@ -923,56 +923,56 @@ static const struct built_in_command bltins2[] = {
 #endif
 
 #ifndef debug_printf
-# define debug_printf(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_parse
-# define debug_printf_parse(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_parse(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_exec
-#define debug_printf_exec(...) (indent(), fprintf(stderr, __VA_ARGS__))
+#define debug_printf_exec(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_env
-# define debug_printf_env(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_env(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_jobs
-# define debug_printf_jobs(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_jobs(...) (indent(), fdprintf(2, __VA_ARGS__))
 # define DEBUG_JOBS 1
 #else
 # define DEBUG_JOBS 0
 #endif
 
 #ifndef debug_printf_expand
-# define debug_printf_expand(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_expand(...) (indent(), fdprintf(2, __VA_ARGS__))
 # define DEBUG_EXPAND 1
 #else
 # define DEBUG_EXPAND 0
 #endif
 
 #ifndef debug_printf_varexp
-# define debug_printf_varexp(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_varexp(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_glob
-# define debug_printf_glob(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_glob(...) (indent(), fdprintf(2, __VA_ARGS__))
 # define DEBUG_GLOB 1
 #else
 # define DEBUG_GLOB 0
 #endif
 
 #ifndef debug_printf_list
-# define debug_printf_list(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_list(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_subst
-# define debug_printf_subst(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_subst(...) (indent(), fdprintf(2, __VA_ARGS__))
 #endif
 
 #ifndef debug_printf_clean
-# define debug_printf_clean(...) (indent(), fprintf(stderr, __VA_ARGS__))
+# define debug_printf_clean(...) (indent(), fdprintf(2, __VA_ARGS__))
 # define DEBUG_CLEAN 1
 #else
 # define DEBUG_CLEAN 0
@@ -982,9 +982,9 @@ static const struct built_in_command bltins2[] = {
 static void debug_print_strings(const char *prefix, char **vv)
 {
        indent();
-       fprintf(stderr, "%s:\n", prefix);
+       fdprintf(2, "%s:\n", prefix);
        while (*vv)
-               fprintf(stderr, " '%s'\n", *vv++);
+               fdprintf(2, " '%s'\n", *vv++);
 }
 #else
 # define debug_print_strings(prefix, vv) ((void)0)
@@ -1416,6 +1416,22 @@ static void hush_exit(int exitcode)
                builtin_eval(argv);
        }
 
+#if ENABLE_FEATURE_CLEAN_UP
+       {
+               struct variable *cur_var;
+               if (G.cwd != bb_msg_unknown)
+                       free((char*)G.cwd);
+               cur_var = G.top_var;
+               while (cur_var) {
+                       struct variable *tmp = cur_var;
+                       if (!cur_var->max_len)
+                               free(cur_var->varstr);
+                       cur_var = cur_var->next;
+                       free(tmp);
+               }
+       }
+#endif
+
 #if ENABLE_HUSH_JOB
        fflush_all();
        sigexit(- (exitcode & 0xff));
@@ -2158,22 +2174,22 @@ static void debug_print_list(const char *prefix, o_string *o, int n)
        int i = 0;
 
        indent();
-       fprintf(stderr, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
+       fdprintf(2, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
                        prefix, list, n, string_start, o->length, o->maxlen,
                        !!(o->o_expflags & EXP_FLAG_GLOB),
                        o->has_quoted_part,
                        !!(o->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
        while (i < n) {
                indent();
-               fprintf(stderr, " list[%d]=%d '%s' %p\n", i, (int)list[i],
-                               o->data + (int)list[i] + string_start,
-                               o->data + (int)list[i] + string_start);
+               fdprintf(2, " list[%d]=%d '%s' %p\n", i, (int)(uintptr_t)list[i],
+                               o->data + (int)(uintptr_t)list[i] + string_start,
+                               o->data + (int)(uintptr_t)list[i] + string_start);
                i++;
        }
        if (n) {
-               const char *p = o->data + (int)list[n - 1] + string_start;
+               const char *p = o->data + (int)(uintptr_t)list[n - 1] + string_start;
                indent();
-               fprintf(stderr, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
+               fdprintf(2, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
        }
 }
 #else
@@ -2672,18 +2688,18 @@ static void debug_print_tree(struct pipe *pi, int lvl)
 
        pin = 0;
        while (pi) {
-               fprintf(stderr, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
+               fdprintf(2, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
                                pin, RES[pi->res_word], pi->followup, PIPE[pi->followup]);
                prn = 0;
                while (prn < pi->num_cmds) {
                        struct command *command = &pi->cmds[prn];
                        char **argv = command->argv;
 
-                       fprintf(stderr, "%*s cmd %d assignment_cnt:%d",
+                       fdprintf(2, "%*s cmd %d assignment_cnt:%d",
                                        lvl*2, "", prn,
                                        command->assignment_cnt);
                        if (command->group) {
-                               fprintf(stderr, " group %s: (argv=%p)%s%s\n",
+                               fdprintf(2, " group %s: (argv=%p)%s%s\n",
                                                CMDTYPE[command->cmd_type],
                                                argv
 # if !BB_MMU
@@ -2697,10 +2713,10 @@ static void debug_print_tree(struct pipe *pi, int lvl)
                                continue;
                        }
                        if (argv) while (*argv) {
-                               fprintf(stderr, " '%s'", *argv);
+                               fdprintf(2, " '%s'", *argv);
                                argv++;
                        }
-                       fprintf(stderr, "\n");
+                       fdprintf(2, "\n");
                        prn++;
                }
                pi = pi->next;
@@ -4106,7 +4122,16 @@ static struct pipe *parse_stream(char **pstring,
                                if (IS_NULL_CMD(ctx.command)
                                 && dest.length == 0 && !dest.has_quoted_part
                                ) {
-                                       continue;
+                                       /* This newline can be ignored. But...
+                                        * without the below check, interactive shell
+                                        * will ignore even lines with bare <newline>,
+                                        * and show the continuation prompt:
+                                        * ps1_prompt$ <enter>
+                                        * ps2> _   <=== wrong prompt, should be ps1
+                                        */
+                                       struct pipe *pi = ctx.list_head;
+                                       if (pi->num_cmds != 0)
+                                               continue;
                                }
                                /* Treat newline as a command separator. */
                                done_pipe(&ctx, PIPE_SEQ);
@@ -7445,7 +7470,7 @@ int hush_main(int argc, char **argv)
        unsigned builtin_argc;
        char **e;
        struct variable *cur_var;
-       struct variable shell_ver;
+       struct variable *shell_ver;
 
        INIT_G();
        if (EXIT_SUCCESS) /* if EXIT_SUCCESS == 0, it is already done */
@@ -7454,17 +7479,17 @@ int hush_main(int argc, char **argv)
        G.argv0_for_re_execing = argv[0];
 #endif
        /* Deal with HUSH_VERSION */
-       memset(&shell_ver, 0, sizeof(shell_ver));
-       shell_ver.flg_export = 1;
-       shell_ver.flg_read_only = 1;
+       shell_ver = xzalloc(sizeof(*shell_ver));
+       shell_ver->flg_export = 1;
+       shell_ver->flg_read_only = 1;
        /* Code which handles ${var<op>...} needs writable values for all variables,
         * therefore we xstrdup: */
-       shell_ver.varstr = xstrdup(hush_version_str),
-       G.top_var = &shell_ver;
+       shell_ver->varstr = xstrdup(hush_version_str);
        /* Create shell local variables from the values
         * currently living in the environment */
        debug_printf_env("unsetenv '%s'\n", "HUSH_VERSION");
        unsetenv("HUSH_VERSION"); /* in case it exists in initial env */
+       G.top_var = shell_ver;
        cur_var = G.top_var;
        e = environ;
        if (e) while (*e) {
@@ -7479,8 +7504,8 @@ int hush_main(int argc, char **argv)
                e++;
        }
        /* (Re)insert HUSH_VERSION into env (AFTER we scanned the env!) */
-       debug_printf_env("putenv '%s'\n", shell_ver.varstr);
-       putenv(shell_ver.varstr);
+       debug_printf_env("putenv '%s'\n", shell_ver->varstr);
+       putenv(shell_ver->varstr);
 
        /* Export PWD */
        set_pwd_var(/*exp:*/ 1);
@@ -7840,18 +7865,6 @@ int hush_main(int argc, char **argv)
        parse_and_run_file(stdin);
 
  final_return:
-#if ENABLE_FEATURE_CLEAN_UP
-       if (G.cwd != bb_msg_unknown)
-               free((char*)G.cwd);
-       cur_var = G.top_var->next;
-       while (cur_var) {
-               struct variable *tmp = cur_var;
-               if (!cur_var->max_len)
-                       free(cur_var->varstr);
-               cur_var = cur_var->next;
-               free(tmp);
-       }
-#endif
        hush_exit(G.last_exitcode);
 }
 
index 53537fcd9dceb1e28742a3c9d572af964df50d93..2e9662b2ba0109535fd14650036e07ea0d707a2e 100644 (file)
@@ -15,7 +15,7 @@ static void mkswap_selinux_setcontext(int fd, const char *path)
        if (!is_selinux_enabled())
                return;
 
-       xfstat(fd, &stbuf, argv[0]);
+       xfstat(fd, &stbuf, path);
        if (S_ISREG(stbuf.st_mode)) {
                security_context_t newcon;
                security_context_t oldcon = NULL;