basic/utf8: do not read past end of string when looking for a multi-byte character
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=9341.
This commit is contained in:
@@ -385,13 +385,13 @@ int ask_password_tty(
|
||||
if (!(flags & ASK_PASSWORD_SILENT))
|
||||
backspace_chars(ttyfd, 1);
|
||||
|
||||
/* Remove a full UTF-8 codepoint from the end. For that, figure out where the last one
|
||||
* begins */
|
||||
/* Remove a full UTF-8 codepoint from the end. For that, figure out where the
|
||||
* last one begins */
|
||||
q = 0;
|
||||
for (;;) {
|
||||
size_t z;
|
||||
|
||||
z = utf8_encoded_valid_unichar(passphrase + q);
|
||||
z = utf8_encoded_valid_unichar(passphrase + q, (size_t) -1);
|
||||
if (z == 0) {
|
||||
q = (size_t) -1; /* Invalid UTF8! */
|
||||
break;
|
||||
@@ -410,8 +410,8 @@ int ask_password_tty(
|
||||
|
||||
flags |= ASK_PASSWORD_SILENT;
|
||||
|
||||
/* There are two ways to enter silent mode. Either by pressing backspace as first key
|
||||
* (and only as first key), or ... */
|
||||
/* There are two ways to enter silent mode. Either by pressing backspace as
|
||||
* first key (and only as first key), or ... */
|
||||
|
||||
if (ttyfd >= 0)
|
||||
(void) loop_write(ttyfd, "(no echo) ", 10, false);
|
||||
@@ -440,7 +440,7 @@ int ask_password_tty(
|
||||
|
||||
if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0) {
|
||||
/* Check if we got a complete UTF-8 character now. If so, let's output one '*'. */
|
||||
n = utf8_encoded_valid_unichar(passphrase + codepoint);
|
||||
n = utf8_encoded_valid_unichar(passphrase + codepoint, (size_t) -1);
|
||||
if (n >= 0) {
|
||||
codepoint = p;
|
||||
(void) loop_write(ttyfd, (flags & ASK_PASSWORD_ECHO) ? &c : "*", 1, false);
|
||||
|
||||
+2
-3
@@ -1756,7 +1756,6 @@ static void inc_lines_columns(unsigned *line, unsigned *column, const char *s, s
|
||||
assert(s || n == 0);
|
||||
|
||||
while (n > 0) {
|
||||
|
||||
if (*s == '\n') {
|
||||
(*line)++;
|
||||
*column = 1;
|
||||
@@ -1765,7 +1764,7 @@ static void inc_lines_columns(unsigned *line, unsigned *column, const char *s, s
|
||||
else {
|
||||
int w;
|
||||
|
||||
w = utf8_encoded_valid_unichar(s);
|
||||
w = utf8_encoded_valid_unichar(s, n);
|
||||
if (w < 0) /* count invalid unichars as normal characters */
|
||||
w = 1;
|
||||
else if ((size_t) w > n) /* never read more than the specified number of characters */
|
||||
@@ -1930,7 +1929,7 @@ static int json_parse_string(const char **p, char **ret) {
|
||||
continue;
|
||||
}
|
||||
|
||||
len = utf8_encoded_valid_unichar(c);
|
||||
len = utf8_encoded_valid_unichar(c, (size_t) -1);
|
||||
if (len < 0)
|
||||
return len;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user