apply post-1.12.1 patches, bump version to 1.12.2

diff --git a/Makefile b/Makefile
index f0242b8..c25cf5d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 12
-SUBLEVEL = 1
+SUBLEVEL = 2
 EXTRAVERSION =
 NAME = Unnamed
 
diff --git a/coreutils/basename.c b/coreutils/basename.c
index a3085ed..8a05e92 100644
--- a/coreutils/basename.c
+++ b/coreutils/basename.c
@@ -48,5 +48,5 @@
 
 	/* 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;
 }
diff --git a/coreutils/env.c b/coreutils/env.c
index 66199e8..2f8c8b7 100644
--- a/coreutils/env.c
+++ b/coreutils/env.c
@@ -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 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-
-
diff --git a/editors/vi.c b/editors/vi.c
index 02bdbb3..4accfdb 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -291,6 +291,8 @@
 #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 @@
 	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 @@
 		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 @@
 			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;
diff --git a/findutils/grep.c b/findutils/grep.c
index 9d38ef9..73e74f4 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -363,12 +363,22 @@
 						 * (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, ':');
 				}
diff --git a/include/applets.h b/include/applets.h
index 46135dc..0c9930d 100644
--- a/include/applets.h
+++ b/include/applets.h
@@ -136,7 +136,7 @@
 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_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))
diff --git a/libbb/getopt32.c b/libbb/getopt32.c
index 8fb99b6..ee85181 100644
--- a/libbb/getopt32.c
+++ b/libbb/getopt32.c
@@ -515,28 +515,6 @@
 		}
 	}
 
-	/* 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
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index c2c3ea9..1f21866 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1415,7 +1415,8 @@
 	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 */
diff --git a/libbb/setup_environment.c b/libbb/setup_environment.c
index 04e333f..78318ce 100644
--- a/libbb/setup_environment.c
+++ b/libbb/setup_environment.c
@@ -32,16 +32,16 @@
 
 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");
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index da0dc03..17b373c 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -125,6 +125,7 @@
 	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 @@
 	 * 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 @@
 			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 */
 }
 
diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index 412e71d..8bbc239 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -263,9 +263,9 @@
 	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 @@
 			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 @@
 		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)
diff --git a/shell/ash.c b/shell/ash.c
index d63acc2..492c77e 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -6964,8 +6964,11 @@
 
 #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 @@
 	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;
diff --git a/util-linux/getopt.c b/util-linux/getopt.c
index 4026303..8b5e46c 100644
--- a/util-linux/getopt.c
+++ b/util-linux/getopt.c
@@ -142,7 +142,8 @@
  * 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 @@
 	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