svn commit: r197752 - head/lib/libc/stdio
Max Laier
max at love2party.net
Mon Jan 11 02:16:34 UTC 2010
On Sunday 04 October 2009 21:43:36 David Schultz wrote:
> Author: das
> Date: Sun Oct 4 19:43:36 2009
> New Revision: 197752
> URL: http://svn.freebsd.org/changeset/base/197752
>
> Log:
> Better glibc compatibility for getline/getdelim:
>
> - 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.
>
> MFC After: 2 weeks
> Reported by: naddy
> PR: ports/138320
>
> Modified:
> head/lib/libc/stdio/getdelim.c
>
> Modified: head/lib/libc/stdio/getdelim.c
> ===========================================================================
> === --- head/lib/libc/stdio/getdelim.c Sun Oct 4 19:03:32 2009 (r197751)
> +++ head/lib/libc/stdio/getdelim.c Sun Oct 4 19:43:36 2009 (r197752) @@
> -120,8 +120,8 @@ getdelim(char ** __restrict linep, size_
> goto error;
> }
>
> - if (*linecapp == 0)
> - *linep = NULL;
> + if (*linep == NULL)
> + *linecapp = 0;
>
> if (fp->_r <= 0 && __srefill(fp)) {
> /* If fp is at EOF already, we just need space for the NUL. */
I think we should have kept the original if case here, as well. Otherwise
something like this might fail:
char *line; /* note uninitialized */
size_t len = 0;
getline(&line, &len, fd);
and I think it is a reasonable thing to pass in an uninitialized pointer if
you tell that there is no space associated with it, yet.
I don't know if there are many (ab)uses of getline like this, but I was just
bitten by it.
--
Max
More information about the svn-src-head
mailing list