[PATCH] libio: Add terminating NUL when the first character is EOF in getdelim [BZ #28038]

Collin Funk collin.funk1@gmail.com
Wed Oct 29 02:24:34 GMT 2025


Hi Florian,

Florian Weimer <fweimer@redhat.com> said:

> * Collin Funk:
> 
> > POSIX requires that the buffer used by getdelim/getline add a
> > terminating NUL whenever an EOF is read.
> >
> > * libio/iogetdelim.c (__getdelim): Add a NUL byte when the first
> > __underflow is called.
> > * libio/tst-getdelim.c (do_test): Add a test case for the bug.
> >
> > -- 8< --
> >
> > If this patch is okay for glibc, then I will push it to Gnulib as well
> > since the function is mostly copied over there.
> >
> > ---
> >  libio/iogetdelim.c   |  1 +
> >  libio/tst-getdelim.c | 17 +++++++++++++++++
> >  2 files changed, 18 insertions(+)
> >
> > diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c
> > index 0bfaef227a..1d89757352 100644
> > --- a/libio/iogetdelim.c
> > +++ b/libio/iogetdelim.c
> > @@ -77,6 +77,7 @@ __getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
> >        if (__underflow (fp) == EOF)
> >  	{
> >  	  result = -1;
> > +	  (*lineptr)[0] = '\0';
> >  	  goto unlock_return;
> >  	}
> >        len = fp->_IO_read_end - fp->_IO_read_ptr;
> 
> Looks okay.  The buffer is already allocated at this point.  I don't
> think there is backwards compatibility impact.

I had thought this was harmless as well, but now am considering
reverting it or introducing a compat symbol.

There is more discussion in the bug report and on bug-gnulib [1][2]. The
shortened story is that nbdkit used a loop like the following to get the
last line of 'du -cs':

    while (getline (&line, &len, fp) != -1)
      ;
    /* Process last line stored in LINE.  */

This code was buggy before my patch in the rare case that 'du' produced
no output. But they noticed it upon testing on Rawhide because after a
normal invocation line[0] == '\0' instead of having the last line.

Since the original standardization of getline/getdelim was based on the
existing glibc functions, Eric Blake opened a bug report with the Austin
Group to request clarification on this [3].

I'm a bit torn on which behavior is better, so others thoughts would be
appreciated.

Collin

[1] https://sourceware.org/bugzilla/show_bug.cgi?id=28038
[2] https://lists.gnu.org/archive/html/bug-gnulib/2025-10/msg00096.html
[3] https://www.austingroupbugs.net/view.php?id=1953


More information about the Libc-alpha mailing list