apply post-1.12.1 patches, bump version to 1.12.2 1_12_2
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 9 Nov 2008 17:21:26 +0000 (17:21 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 9 Nov 2008 17:21:26 +0000 (17:21 -0000)
13 files changed:
Makefile
coreutils/basename.c
coreutils/env.c
editors/vi.c
findutils/grep.c
include/applets.h
libbb/getopt32.c
libbb/lineedit.c
libbb/setup_environment.c
libbb/vfork_daemon_rexec.c
modutils/modprobe.c
shell/ash.c
util-linux/getopt.c

index f0242b8c818ed8dfe8959a0ba1347bbe35bd7e78..c25cf5d11570ef91289f3ec01ae64f6b92c2c29b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 12
-SUBLEVEL = 1
+SUBLEVEL = 2
 EXTRAVERSION =
 NAME = Unnamed
 
index a3085ede3079eded33e0f901725f06f1937c5416..8a05e92e5f58ac53b380e6065a8d307953791e87 100644 (file)
@@ -48,5 +48,5 @@ int basename_main(int argc, char **argv)
 
        /* puts(s) will do, but we can do without stdio this way: */
        s[m++] = '\n';
-       return full_write(STDOUT_FILENO, s, m) == (ssize_t)m;
+       return full_write(STDOUT_FILENO, s, m) != (ssize_t)m;
 }
index 66199e8d6adf355efd0658029372ad208fb97e1e..2f8c8b71d047dc1ed43c159356bc22decac3509a 100644 (file)
@@ -29,6 +29,8 @@
  * - use xfunc_error_retval
  */
 
+/* This is a NOEXEC applet. Be very careful! */
+
 #include "libbb.h"
 
 #if ENABLE_FEATURE_ENV_LONG_OPTIONS
@@ -119,5 +121,3 @@ int env_main(int argc UNUSED_PARAM, char **argv)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-
-
index 02bdbb37ba6625e8bf18fa4f3b053c226b0e3dba..4accfdbb19f4f14818c709173e1e288caeb3e8de 100644 (file)
@@ -291,6 +291,8 @@ struct globals {
 #define INIT_G() do { \
        SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
        last_file_modified = -1; \
+       /* "" but has space for 2 chars */ \
+       USE_FEATURE_VI_SEARCH(last_search_pattern = xzalloc(2);) \
 } while (0)
 
 
@@ -2974,7 +2976,7 @@ static void do_cmd(char c)
        const char *msg = msg; // for compiler
        char c1, *p, *q, *save_dot;
        char buf[12];
-       int dir = dir; // for compiler
+       int dir;
        int cnt, i, j;
 
 //     c1 = c; // quiet the compiler
@@ -3316,7 +3318,7 @@ static void do_cmd(char c)
                q = get_input_line(buf);        // get input line- use "status line"
                if (q[0] && !q[1]) {
                        if (last_search_pattern[0])
-                           last_search_pattern[0] = c;
+                               last_search_pattern[0] = c;
                        goto dc3; // if no pat re-use old pat
                }
                if (q[0]) {       // strlen(q) > 1: new pat- save it and find
@@ -3346,14 +3348,8 @@ static void do_cmd(char c)
                        do_cmd(c);
                }                               // repeat cnt
  dc3:
-               if (last_search_pattern == 0) {
-                       msg = "No previous regular expression";
-                       goto dc2;
-               }
-               if (last_search_pattern[0] == '/') {
-                       dir = FORWARD;  // assume FORWARD search
-                       p = dot + 1;
-               }
+               dir = FORWARD;  // assume FORWARD search
+               p = dot + 1;
                if (last_search_pattern[0] == '?') {
                        dir = BACK;
                        p = dot - 1;
index 9d38ef9128e29bdb5641a7a1b1baba8834bd75f3..73e74f4b38383b00897014c1630bc015fbbaadeb 100644 (file)
@@ -363,12 +363,22 @@ static int grep_file(FILE *file)
                                                 * (unless -v: -Fov doesnt print anything at all) */
                                                if (found)
                                                        print_line(gl->pattern, strlen(gl->pattern), linenum, ':');
-                                       } else {
+                                       } else while (1) {
+                                               char old = line[gl->matched_range.rm_eo];
                                                line[gl->matched_range.rm_eo] = '\0';
                                                print_line(line + gl->matched_range.rm_so,
                                                                gl->matched_range.rm_eo - gl->matched_range.rm_so,
                                                                linenum, ':');
-                                       }
+                                               line[gl->matched_range.rm_eo] = old;
+#if !ENABLE_EXTRA_COMPAT
+                                               break;
+#else
+                                               if (re_search(&gl->compiled_regex, line, line_len,
+                                                               gl->matched_range.rm_eo, line_len - gl->matched_range.rm_eo, 
+                                                               &gl->matched_range) < 0)
+                                                       break;
+#endif
+                                       } 
                                } else {
                                        print_line(line, line_len, linenum, ':');
                                }
index 46135dccb20fdf79f11eb28ce6c6875ad5d777a1..0c9930d45923b022360405ed6c3b56ffe17f057b 100644 (file)
@@ -136,7 +136,7 @@ USE_ECHO(APPLET_NOFORK(echo, echo, _BB_DIR_BIN, _BB_SUID_NEVER, echo))
 USE_ED(APPLET(ed, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_FEATURE_GREP_EGREP_ALIAS(APPLET_ODDNAME(egrep, grep, _BB_DIR_BIN, _BB_SUID_NEVER, egrep))
 USE_EJECT(APPLET(eject, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
-USE_ENV(APPLET(env, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
+USE_ENV(APPLET_NOEXEC(env, env, _BB_DIR_USR_BIN, _BB_SUID_NEVER, env))
 USE_ENVDIR(APPLET_ODDNAME(envdir, chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER, envdir))
 USE_ENVUIDGID(APPLET_ODDNAME(envuidgid, chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER, envuidgid))
 USE_ETHER_WAKE(APPLET_ODDNAME(ether-wake, ether_wake, _BB_DIR_USR_BIN, _BB_SUID_NEVER, ether_wake))
@@ -171,7 +171,7 @@ USE_GREP(APPLET(grep, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_GUNZIP(APPLET(gunzip, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_GZIP(APPLET(gzip, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_HALT(APPLET(halt, _BB_DIR_SBIN, _BB_SUID_NEVER))
-USE_HD(APPLET_ODDNAME(hd, hexdump, _BB_DIR_USR_BIN, _BB_SUID_NEVER, hd))
+USE_HD(APPLET_NOEXEC(hd, hexdump, _BB_DIR_USR_BIN, _BB_SUID_NEVER, hd))
 USE_HDPARM(APPLET(hdparm, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_HEAD(APPLET(head, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
 USE_HEXDUMP(APPLET_NOEXEC(hexdump, hexdump, _BB_DIR_USR_BIN, _BB_SUID_NEVER, hexdump))
index 8fb99b6cca116fe70decac3c5ec86b4122c10c1c..ee85181cd2d670cd16e5a938c468ed0a4323939f 100644 (file)
@@ -515,28 +515,6 @@ getopt32(char **argv, const char *applet_opts, ...)
                }
        }
 
-       /* In case getopt32 was already called:
-        * reset the libc getopt() function, which keeps internal state.
-        *
-        * BSD-derived getopt() functions require that optind be set to 1 in
-        * order to reset getopt() state.  This used to be generally accepted
-        * way of resetting getopt().  However, glibc's getopt()
-        * has additional getopt() state beyond optind, and requires that
-        * optind be set to zero to reset its state.  So the unfortunate state of
-        * affairs is that BSD-derived versions of getopt() misbehave if
-        * optind is set to 0 in order to reset getopt(), and glibc's getopt()
-        * will core dump if optind is set 1 in order to reset getopt().
-        *
-        * More modern versions of BSD require that optreset be set to 1 in
-        * order to reset getopt().   Sigh.  Standards, anyone?
-        */
-#ifdef __GLIBC__
-       optind = 0;
-#else /* BSD style */
-       optind = 1;
-       /* optreset = 1; */
-#endif
-       /* optarg = NULL; opterr = 0; optopt = 0; - do we need this?? */
        pargv = NULL;
 
        /* Note: just "getopt() <= 0" will not work well for
index c2c3ea99661b7839101af2e71ef7ed834f59bc86..1f21866ca65b28a34603d80a532febae8042332a 100644 (file)
@@ -1415,7 +1415,8 @@ int FAST_FUNC read_line_input(const char *prompt, char *command, int maxsize, li
        if ((state->flags & SAVE_HISTORY) && state->hist_file)
                load_history(state->hist_file);
 #endif
-       state->cur_history = state->cnt_history;
+       if (state->flags & DO_HISTORY)
+               state->cur_history = state->cnt_history;
 
        /* prepare before init handlers */
        cmdedit_y = 0;  /* quasireal y, not true if line > xt*yt */
index 04e333feddda6dd0f8686f5fd7872919a2932505..78318ce62f24da4187f0a29688b5255669188036 100644 (file)
 
 void FAST_FUNC setup_environment(const char *shell, int clear_env, int change_env, const struct passwd *pw)
 {
+       /* Change the current working directory to be the home directory
+        * of the user */
+       if (chdir(pw->pw_dir)) {
+               xchdir("/");
+               bb_error_msg("can't chdir to home directory '%s'", pw->pw_dir);
+       }
+
        if (clear_env) {
                const char *term;
 
-               /* Change the current working directory to be the home directory
-                * of the user */
-               if (chdir(pw->pw_dir)) {
-                       xchdir("/");
-                       bb_error_msg("can't chdir to home directory '%s'", pw->pw_dir);
-               }
-
                /* Leave TERM unchanged. Set HOME, SHELL, USER, LOGNAME, PATH.
                   Unset all other environment variables.  */
                term = getenv("TERM");
index da0dc03e58b236f38c360a383f75e30aea185bb1..17b373cd1b00222d236aaadc68f4c4e5b11fd670 100644 (file)
@@ -125,6 +125,7 @@ int FAST_FUNC run_nofork_applet_prime(struct nofork_save_area *old, int applet_n
        int rc, argc;
 
        applet_name = APPLET_NAME(applet_no);
+
        xfunc_error_retval = EXIT_FAILURE;
 
        /* Special flag for xfunc_die(). If xfunc will "die"
@@ -132,7 +133,30 @@ int FAST_FUNC run_nofork_applet_prime(struct nofork_save_area *old, int applet_n
         * die_sleep and longjmp here instead. */
        die_sleep = -1;
 
-       /* option_mask32 = 0; - not needed */
+       /* In case getopt() or getopt32() was already called:
+        * reset the libc getopt() function, which keeps internal state.
+        *
+        * BSD-derived getopt() functions require that optind be set to 1 in
+        * order to reset getopt() state.  This used to be generally accepted
+        * way of resetting getopt().  However, glibc's getopt()
+        * has additional getopt() state beyond optind, and requires that
+        * optind be set to zero to reset its state.  So the unfortunate state of
+        * affairs is that BSD-derived versions of getopt() misbehave if
+        * optind is set to 0 in order to reset getopt(), and glibc's getopt()
+        * will core dump if optind is set 1 in order to reset getopt().
+        *
+        * More modern versions of BSD require that optreset be set to 1 in
+        * order to reset getopt().  Sigh.  Standards, anyone?
+        */
+#ifdef __GLIBC__
+       optind = 0;
+#else /* BSD style */
+       optind = 1;
+       /* optreset = 1; */
+#endif
+       /* optarg = NULL; opterr = 1; optopt = 63; - do we need this too? */
+       /* (values above are what they initialized to in glibc and uclibc) */
+       /* option_mask32 = 0; - not needed, no applet depends on it being 0 */
 
        argc = 1;
        while (argv[argc])
@@ -161,8 +185,16 @@ int FAST_FUNC run_nofork_applet_prime(struct nofork_save_area *old, int applet_n
                        rc = 0;
        }
 
-       /* Restoring globals */
+       /* Restoring some globals */
        restore_nofork_data(old);
+
+       /* Other globals can be simply reset to defaults */
+#ifdef __GLIBC__
+       optind = 0;
+#else /* BSD style */
+       optind = 1;
+#endif
+
        return rc & 0xff; /* don't confuse people with "exitcodes" >255 */
 }
 
index 412e71d16b7535809432c37b90186f7552679ae4..8bbc2397c7328385398d1e147dc07307fe2c404e 100644 (file)
@@ -263,9 +263,9 @@ static int FAST_FUNC include_conf_dir_act(const char *filename UNUSED_PARAM,
        return TRUE;
 }
 
-static int include_conf_recursive(struct include_conf_t *conf, const char *filename)
+static int include_conf_recursive(struct include_conf_t *conf, const char *filename, int flags)
 {
-       return recursive_action(filename, ACTION_RECURSE,
+       return recursive_action(filename, ACTION_RECURSE | flags,
                                include_conf_file_act,
                                include_conf_dir_act,
                                conf, 1);
@@ -362,7 +362,7 @@ static int FAST_FUNC include_conf_file_act(const char *filename,
                        char *includefile;
 
                        includefile = skip_whitespace(line_buffer + 8);
-                       include_conf_recursive(conf, includefile);
+                       include_conf_recursive(conf, includefile, 0);
                } else if (ENABLE_FEATURE_MODPROBE_BLACKLIST &&
                                (is_conf_command(line_buffer, "blacklist"))) {
                        char *mod;
@@ -559,7 +559,7 @@ static struct dep_t *build_dep(void)
                if (ENABLE_FEATURE_2_6_MODULES) {
                        if (include_conf_file(&conf, "/etc/modprobe.conf"))
                                r = TRUE;
-                       if (include_conf_recursive(&conf, "/etc/modprobe.d"))
+                       if (include_conf_recursive(&conf, "/etc/modprobe.d", ACTION_QUIET))
                                r = TRUE;
                }
                if (ENABLE_FEATURE_2_4_MODULES && !r)
index d63acc2c84b5cdcd33a9a958bbacbf07ab09b6c4..492c77eddc8bf95b8f1a61430e8e41d07d394550 100644 (file)
@@ -6964,8 +6964,11 @@ tryexec(USE_FEATURE_SH_STANDALONE(int applet_no,) char *cmd, char **argv, char *
 
 #if ENABLE_FEATURE_SH_STANDALONE
        if (applet_no >= 0) {
-               if (APPLET_IS_NOEXEC(applet_no))
+               if (APPLET_IS_NOEXEC(applet_no)) {
+                       while (*envp)
+                               putenv(*envp++);
                        run_applet_no_and_exit(applet_no, argv);
+               }
                /* re-exec ourselves with the new arguments */
                execve(bb_busybox_exec_path, argv, envp);
                /* If they called chroot or otherwise made the binary no longer
@@ -12014,7 +12017,7 @@ exportcmd(int argc UNUSED_PARAM, char **argv)
        char *name;
        const char *p;
        char **aptr;
-       int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT;
+       int flag = argv[0][0] == 'r' ? VREADONLY : VEXPORT;
 
        if (nextopt("p") != 'p') {
                aptr = argptr;
index 4026303858230a73bae507e8040efd27efbca184..8b5e46c7b57e0ee4533ef701be8ef0f69194d6ac 100644 (file)
@@ -142,7 +142,8 @@ static const char *normalize(const char *arg)
  * Other settings are found in global variables.
  */
 #if !ENABLE_GETOPT_LONG
-#define generate_output(argv,argc,optstr,longopts) generate_output(argv,argc,optstr)
+#define generate_output(argv,argc,optstr,longopts) \
+       generate_output(argv,argc,optstr)
 #endif
 static int generate_output(char **argv, int argc, const char *optstr, const struct option *longopts)
 {
@@ -156,14 +157,6 @@ static int generate_output(char **argv, int argc, const char *optstr, const stru
        if (quiet_errors) /* No error reporting from getopt(3) */
                opterr = 0;
 
-       /* Reset getopt(3) (see libbb/getopt32.c for long rant) */
-#ifdef __GLIBC__
-       optind = 0;
-#else /* BSD style */
-       optind = 1;
-       /* optreset = 1; */
-#endif
-
        while (1) {
                opt =
 #if ENABLE_GETOPT_LONG