diff -urpN busybox-1.15.1/libbb/lineedit.c busybox-1.15.1-lineedit/libbb/lineedit.c --- busybox-1.15.1/libbb/lineedit.c 2009-09-12 17:55:58.000000000 +0200 +++ busybox-1.15.1-lineedit/libbb/lineedit.c 2009-09-28 23:56:03.000000000 +0200 @@ -114,8 +114,8 @@ struct lineedit_statics { unsigned cmdedit_prmt_len; /* length of prompt (without colors etc) */ unsigned cursor; - unsigned command_len; - /* *int* maxsize: we want x in "if (x > S.maxsize)" + int command_len; /* must be signed (^D returns -1 len) */ + /* signed maxsize: we want x in "if (x > S.maxsize)" * to _not_ be promoted to unsigned */ int maxsize; CHAR_T *command_ps; @@ -1095,15 +1095,15 @@ static void save_command_ps_at_cur_histo int cur = state->cur_history; free(state->history[cur]); -#if ENABLE_FEATURE_ASSUME_UNICODE +# if ENABLE_FEATURE_ASSUME_UNICODE { char tbuf[MAX_LINELEN]; save_string(tbuf, sizeof(tbuf)); state->history[cur] = xstrdup(tbuf); } -#else +# else state->history[cur] = xstrdup(command_ps); -#endif +# endif } } @@ -1131,7 +1131,7 @@ static int get_next_history(void) return 0; } -#if ENABLE_FEATURE_EDITING_SAVEHISTORY +# if ENABLE_FEATURE_EDITING_SAVEHISTORY /* We try to ensure that concurrent additions to the history * do not overwrite each other. * Otherwise shell users get unhappy. @@ -1256,10 +1256,10 @@ static void save_history(char *str) free_line_input_t(st_temp); } } -#else -#define load_history(a) ((void)0) -#define save_history(a) ((void)0) -#endif /* FEATURE_COMMAND_SAVEHISTORY */ +# else +# define load_history(a) ((void)0) +# define save_history(a) ((void)0) +# endif /* FEATURE_COMMAND_SAVEHISTORY */ static void remember_in_history(char *str) { @@ -1290,15 +1290,15 @@ static void remember_in_history(char *st /* i <= MAX_HISTORY */ state->cur_history = i; state->cnt_history = i; -#if ENABLE_FEATURE_EDITING_SAVEHISTORY +# if MAX_HISTORY > 0 && ENABLE_FEATURE_EDITING_SAVEHISTORY if ((state->flags & SAVE_HISTORY) && state->hist_file) save_history(str); -#endif +# endif IF_FEATURE_EDITING_FANCY_PROMPT(num_ok_lines++;) } #else /* MAX_HISTORY == 0 */ -#define remember_in_history(a) ((void)0) +# define remember_in_history(a) ((void)0) #endif /* MAX_HISTORY */ @@ -1476,11 +1476,11 @@ static void parse_and_put_prompt(const c c = *prmt_ptr++; switch (c) { -#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR +# if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR case 'u': pbuf = user_buf ? user_buf : (char*)""; break; -#endif +# endif case 'h': pbuf = free_me = safe_gethostname(); *strchrnul(pbuf, '.') = '\0'; @@ -1488,7 +1488,7 @@ static void parse_and_put_prompt(const c case '$': c = (geteuid() == 0 ? '#' : '$'); break; -#if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR +# if ENABLE_FEATURE_GETUSERNAME_AND_HOMEDIR case 'w': /* /home/user[/something] -> ~[/something] */ pbuf = cwd_buf; @@ -1501,7 +1501,7 @@ static void parse_and_put_prompt(const c pbuf = free_me = xasprintf("~%s", cwd_buf + l); } break; -#endif +# endif case 'W': pbuf = cwd_buf; cp = strrchr(pbuf, '/'); @@ -1688,13 +1688,15 @@ int FAST_FUNC read_line_input(const char /* With null flags, no other fields are ever used */ state = st ? st : (line_input_t*) &const_int_0; -#if ENABLE_FEATURE_EDITING_SAVEHISTORY +#if MAX_HISTORY > 0 +# if ENABLE_FEATURE_EDITING_SAVEHISTORY if ((state->flags & SAVE_HISTORY) && state->hist_file) if (state->cnt_history == 0) load_history(state); -#endif +# endif if (state->flags & DO_HISTORY) state->cur_history = state->cnt_history; +#endif /* prepare before init handlers */ cmdedit_y = 0; /* quasireal y, not true if line > xt*yt */ @@ -1716,7 +1718,7 @@ int FAST_FUNC read_line_input(const char new_settings.c_cc[VTIME] = 0; /* Turn off CTRL-C, so we can trap it */ #ifndef _POSIX_VDISABLE -#define _POSIX_VDISABLE '\0' +# define _POSIX_VDISABLE '\0' #endif new_settings.c_cc[VINTR] = _POSIX_VDISABLE; tcsetattr_stdin_TCSANOW(&new_settings); @@ -2037,7 +2039,8 @@ int FAST_FUNC read_line_input(const char rewrite_line: /* Rewrite the line with the selected history item */ /* change command */ - command_len = load_string(state->history[state->cur_history] ? : "", maxsize); + command_len = load_string(state->history[state->cur_history] ? + state->history[state->cur_history] : "", maxsize); /* redraw and go to eol (bol, in vi) */ redraw(cmdedit_y, (state->flags & VI_MODE) ? 9999 : 0); break; @@ -2121,7 +2124,9 @@ int FAST_FUNC read_line_input(const char #undef command #if ENABLE_FEATURE_ASSUME_UNICODE - command_len = save_string(command, maxsize - 1); + command[0] = '\0'; + if (command_len > 0) + command_len = save_string(command, maxsize - 1); free(command_ps); #endif