diff options
Diffstat (limited to 'ares/ares__read_line.c')
-rw-r--r-- | ares/ares__read_line.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/ares/ares__read_line.c b/ares/ares__read_line.c index 29f8e5dc0..2e94945dc 100644 --- a/ares/ares__read_line.c +++ b/ares/ares__read_line.c @@ -20,6 +20,7 @@ #include <stdlib.h> #include <string.h> #include "ares.h" +#include "ares_nowarn.h" #include "ares_private.h" /* This is an internal function. Its contract is to read a line from @@ -46,7 +47,9 @@ int ares__read_line(FILE *fp, char **buf, size_t *bufsize) for (;;) { - if (!fgets(*buf + offset, (int)(*bufsize - offset), fp)) + int bytestoread = aresx_uztosi(*bufsize - offset); + + if (!fgets(*buf + offset, bytestoread, fp)) return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF; len = offset + strlen(*buf + offset); if ((*buf)[len - 1] == '\n') @@ -55,6 +58,8 @@ int ares__read_line(FILE *fp, char **buf, size_t *bufsize) break; } offset = len; + if(len < *bufsize - 1) + continue; /* Allocate more space. */ newbuf = realloc(*buf, *bufsize * 2); |