RELEASE-NOTES: two more bug fixes
[platform/upstream/c-ares.git] / ares__read_line.c
index 8558557..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;
@@ -38,27 +38,32 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
     {
       *buf = malloc(128);
       if (!*buf)
-       return ARES_ENOMEM;
+        return ARES_ENOMEM;
       *bufsize = 128;
     }
 
-  while (1)
+  for (;;)
     {
-      if (!fgets(*buf + offset, *bufsize - (int)offset, fp))
-       return (offset != 0) ? 0 : (ferror(fp)) ? ARES_EFILE : ARES_EOF;
+      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;
-       }
+        {
+          (*buf)[len - 1] = 0;
+          break;
+        }
       offset = len;
+      if(len < *bufsize - 1)
+        continue;
 
       /* Allocate more space. */
       newbuf = realloc(*buf, *bufsize * 2);
       if (!newbuf)
-       return ARES_ENOMEM;
+        return ARES_ENOMEM;
       *buf = newbuf;
       *bufsize *= 2;
     }
+  return ARES_SUCCESS;
 }