Daniel Stenberg <[EMAIL PROTECTED]> writes:

> On Mon, 24 Sep 2001, Lenny Foner wrote:
> 
>> utils.c:906: failed assertion `length > 0'
> 
> This is the key issue here.
> 
> The "file" read by wget (which happens to be a directory in this
> case) returns a zero length line and the assert() line warns about
> this and then aborts.
[...]
> I would fix that assert() to be a better check (...)

A good suggestion; I've now done that.  But instead of returning NULL
like your patch does, my version simply skips such an "invalid" line.
In a later release, I'll rewrite the function to report the length of
the line to the callers that are interested, so it will be usable with
binary data.

2001-12-06  Hrvoje Niksic  <[EMAIL PROTECTED]>

        * utils.c (read_whole_line): Handle lines beginning with \0.

Index: src/utils.c
===================================================================
RCS file: /pack/anoncvs/wget/src/utils.c,v
retrieving revision 1.33
diff -u -r1.33 utils.c
--- src/utils.c 2001/12/04 23:42:18     1.33
+++ src/utils.c 2001/12/05 23:53:26
@@ -955,14 +955,18 @@
 
 /* Read a line from FP.  The function reallocs the storage as needed
    to accomodate for any length of the line.  Reallocs are done
-   storage exponentially, doubling the storage after each overflow to
-   minimize the number of calls to realloc() and fgets().  The newline
+   exponentially, doubling the storage after each overflow to minimize
+   the number of calls to realloc() and fgets().  The newline
    character at the end of line is retained.
 
    After end-of-file is encountered without anything being read, NULL
    is returned.  NULL is also returned on error.  To distinguish
-   between these two cases, use the stdio function ferror().  */
+   between these two cases, use the stdio function ferror().
 
+   A future version of this function will be rewritten to use fread()
+   instead of fgets(), and to return the length of the line, which
+   will make the function usable on files with binary content.  */
+
 char *
 read_whole_line (FILE *fp)
 {
@@ -973,9 +977,14 @@
   while (fgets (line + length, bufsize - length, fp))
     {
       length += strlen (line + length);
-      assert (length > 0);
+      if (length == 0)
+       /* Possible for example when reading from a binary file where
+          a line begins with \0.  */
+       continue;
+
       if (line[length - 1] == '\n')
        break;
+
       /* fgets() guarantees to read the whole line, or to use up the
          space we've given it.  We can double the buffer
          unconditionally.  */

Reply via email to