getline(3): Fix segfault caused by NULL pointer
authorJohn Marino <netbsd@marino.st>
Wed, 7 Nov 2012 20:15:35 +0000 (21:15 +0100)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Wed, 7 Nov 2012 22:31:45 +0000 (23:31 +0100)
This fixes a segfault seen with pkg's audit function, and effectively syncs
getdelim with FreeBSD.

Taken-from: FreeBSD SVN 197752 (04 OCT 2009)

- Tolerate applications that pass a NULL pointer for the buffer and
  claim that the capacity of the buffer is nonzero.

- If an application passes in a non-NULL buffer pointer and claims the
  buffer has zero capacity, we should free (well, realloc) it anyway.
  It could have been obtained from malloc(0), so failing to free it
  would be a small memory leak.

lib/libc/stdio/getdelim.c

index bb88633..4846157 100644 (file)
@@ -120,8 +120,8 @@ getdelim(char ** __restrict linep, size_t * __restrict linecapp, int delim,
                goto error;
        }
 
-       if (*linecapp == 0)
-               *linep = NULL;
+       if (*linep == NULL)
+               *linecapp = 0;
 
        if (fp->pub._r <= 0 && __srefill(fp)) {
                /* If fp is at EOF already, we just need space for the NUL. */