From 33eff78c8b28adc4963987880e10d96761f2a167 Mon Sep 17 00:00:00 2001 From: Collin Funk Date: Wed, 8 Oct 2025 20:10:44 -0700 Subject: [PATCH] libio: Add terminating NUL when the first character is EOF in getdelim [BZ #28038] 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. Reviewed-by: Florian Weimer --- 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; diff --git a/libio/tst-getdelim.c b/libio/tst-getdelim.c index 1f35f9f685..556697453c 100644 --- a/libio/tst-getdelim.c +++ b/libio/tst-getdelim.c @@ -27,6 +27,7 @@ #include #include #include +#include static int do_test (void) @@ -50,6 +51,22 @@ do_test (void) xfclose (memstream); free (lineptr); + /* Test that getdelim NUL terminates upon reading an EOF from an empty + file (BZ #28038). This test fails on glibc 2.42 and earlier. */ + lineptr = xmalloc (1); + lineptr[0] = 'A'; + linelen = 1; + char *file_name; + TEST_VERIFY_EXIT (create_temp_file ("tst-getdelim.", &file_name) != -1); + FILE *fp = fopen (file_name, "r"); + TEST_VERIFY_EXIT (fp != NULL); + TEST_VERIFY (getdelim (&lineptr, &linelen, '\n', fp) == -1); + TEST_VERIFY (linelen > 0); + TEST_VERIFY (lineptr[0] == '\0'); + fclose (fp); + free (file_name); + free (lineptr); + return 0; } -- 2.47.3