string_fgets:
Fix buffer overflow for very big string
This commit is contained in:
1 parent
82906e03e9
commit
b0d2557ea1
1 file changed
+8
-2
+8
-2
@@ -851,8 +851,11 @@ string_fgets(string_t v, FILE *f, string_fgets_t arg)
|
|||||||
size_t alloc = string_capacity(v);
|
size_t alloc = string_capacity(v);
|
||||||
ptr[0] = 0;
|
ptr[0] = 0;
|
||||||
bool retcode = false; /* Nothing has been read yet */
|
bool retcode = false; /* Nothing has been read yet */
|
||||||
while (fgets(&ptr[size], alloc - size, f) != NULL) {
|
/* alloc - size is very unlikely to be bigger than INT_MAX
|
||||||
|
but fgets accepts an int as the size argument */
|
||||||
|
while (fgets(&ptr[size], (int) M_MIN( (alloc - size), (size_t) INT_MAX ), f) != NULL) {
|
||||||
retcode = true; /* Something has been read */
|
retcode = true; /* Something has been read */
|
||||||
|
// fgets doesn't return the number of characters read, so we need to count.
|
||||||
size += strlen(&ptr[size]);
|
size += strlen(&ptr[size]);
|
||||||
if (arg != STRING_READ_FILE && ptr[size-1] == '\n') {
|
if (arg != STRING_READ_FILE && ptr[size-1] == '\n') {
|
||||||
if (arg == STRING_READ_PURE_LINE) {
|
if (arg == STRING_READ_PURE_LINE) {
|
||||||
@@ -1976,7 +1979,10 @@ namespace m_string {
|
|||||||
/* Cannot use m_core_hash: alignment not sufficent */ \
|
/* Cannot use m_core_hash: alignment not sufficent */ \
|
||||||
M_HASH_DECL(hash); \
|
M_HASH_DECL(hash); \
|
||||||
const char *str = s->s; \
|
const char *str = s->s; \
|
||||||
while (*str) M_HASH_UP(hash, (size_t) *str++); \
|
while (*str) { \
|
||||||
|
size_t h = (size_t) *str++; \
|
||||||
|
M_HASH_UP(hash, h); \
|
||||||
|
} \
|
||||||
return M_HASH_FINAL(hash); \
|
return M_HASH_FINAL(hash); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|||||||
Reference in new issue
Block a user