Fix corner case of string_fget_word when it doesn't end with a separator
This commit is contained in:
1 parent
32b6f82249
commit
dd5c9ac8ad
1 file changed
+7
-2
+7
-2
@@ -917,10 +917,13 @@ string_fget_word (string_t v, const char separator[], FILE *f)
|
|||||||
as a control over this argument may give an attacker
|
as a control over this argument may give an attacker
|
||||||
an opportunity for stack overflow */
|
an opportunity for stack overflow */
|
||||||
while (snprintf(buffer, sizeof buffer -1, " %%%zu[^%s]%%c", (size_t) alloc-1-size, separator) > 0
|
while (snprintf(buffer, sizeof buffer -1, " %%%zu[^%s]%%c", (size_t) alloc-1-size, separator) > 0
|
||||||
&& fscanf(f, buffer, &ptr[size], &c) == 2) {
|
/* We may read one or two argument(s) */
|
||||||
|
&& fscanf(f, buffer, &ptr[size], &c) >= 1) {
|
||||||
retcode = true;
|
retcode = true;
|
||||||
size += strlen(&ptr[size]);
|
size += strlen(&ptr[size]);
|
||||||
if (strchr(separator, c) != NULL)
|
/* If we read only one argument
|
||||||
|
or if the final read character is a separator */
|
||||||
|
if (c == 0 || strchr(separator, c) != NULL)
|
||||||
break;
|
break;
|
||||||
/* Next char is not a separator: continue parsing */
|
/* Next char is not a separator: continue parsing */
|
||||||
stringi_set_size(v, size);
|
stringi_set_size(v, size);
|
||||||
@@ -929,6 +932,8 @@ string_fget_word (string_t v, const char separator[], FILE *f)
|
|||||||
assert (alloc > size + 1);
|
assert (alloc > size + 1);
|
||||||
ptr[size++] = c;
|
ptr[size++] = c;
|
||||||
ptr[size] = 0;
|
ptr[size] = 0;
|
||||||
|
// Invalid c character for next iteration
|
||||||
|
c= 0;
|
||||||
}
|
}
|
||||||
stringi_set_size(v, size);
|
stringi_set_size(v, size);
|
||||||
STRINGI_CONTRACT(v);
|
STRINGI_CONTRACT(v);
|
||||||
|
|||||||
Reference in new issue
Block a user