RELEASE-NOTES: two more bug fixes
[platform/upstream/c-ares.git] / ares__read_line.c
index 5a66c63..bd9504f 100644 (file)
@@ -1,3 +1,4 @@
+
 /* Copyright 1998 by the Massachusetts Institute of Technology.
  *
  * Permission to use, copy, modify, and distribute this
  * without express or implied warranty.
  */
 
-#include "setup.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "ares_setup.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
@@ -28,7 +28,7 @@
  * appropriate.  The initial value of *buf should be NULL.  After the
  * calling routine is done reading lines, it should free *buf.
  */
-int ares__read_line(FILE *fp, char **buf, int *bufsize)
+int ares__read_line(FILE *fp, char **buf, size_t *bufsize)
 {
   char *newbuf;
   size_t offset = 0;
@@ -42,17 +42,21 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
       *bufsize = 128;
     }
 
-  while (1)
+  for (;;)
     {
-      if (!fgets(*buf + offset, *bufsize - (int)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')
         {
           (*buf)[len - 1] = 0;
-          return ARES_SUCCESS;
+          break;
         }
       offset = len;
+      if(len < *bufsize - 1)
+        continue;
 
       /* Allocate more space. */
       newbuf = realloc(*buf, *bufsize * 2);
@@ -61,4 +65,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
       *buf = newbuf;
       *bufsize *= 2;
     }
+  return ARES_SUCCESS;
 }