aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbb/lineedit.c16
-rw-r--r--libbb/unicode.c2
2 files changed, 14 insertions, 4 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index de7042491..381203a22 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1061,9 +1061,16 @@ static void input_tab(smallint *lastWasTab)
/* Make a local copy of the string --
* up to the position of the cursor */
+#if !ENABLE_UNICODE_SUPPORT
save_string(matchBuf, cursor + 1);
-#if ENABLE_UNICODE_SUPPORT
- cursor_mb = strlen(matchBuf);
+#else
+ {
+ CHAR_T wc = command_ps[cursor];
+ command_ps[cursor] = 0;
+ save_string(matchBuf, MAX_LINELEN);
+ command_ps[cursor] = wc;
+ cursor_mb = strlen(matchBuf);
+ }
#endif
tmp = matchBuf;
@@ -1167,7 +1174,10 @@ static void input_tab(smallint *lastWasTab)
sprintf(&command[cursor_mb - recalc_pos], "%s%s", tmp, matchBuf);
command_len = load_string(command, S.maxsize);
/* write out the matched command */
- redraw(cmdedit_y, command_len - len);
+ /* paranoia: load_string can return 0 on conv error,
+ * prevent passing len = (0 - 12) to redraw */
+ len = command_len - len;
+ redraw(cmdedit_y, len >= 0 ? len : 0);
}
}
#endif
diff --git a/libbb/unicode.c b/libbb/unicode.c
index c4b5f86ee..70c6abe00 100644
--- a/libbb/unicode.c
+++ b/libbb/unicode.c
@@ -131,7 +131,7 @@ size_t FAST_FUNC wcstombs(char *dest, const wchar_t *src, size_t n)
size_t len = wcrtomb_internal(tbuf, wc);
if (len > n)
- len = n;
+ break;
memcpy(dest, tbuf, len);
if (wc == L'\0')
return org_n - n;