diff options
author | Andreas Schwab <schwab@suse.de> | 2024-07-08 15:52:35 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2024-07-09 10:12:36 +0200 |
commit | 2213b37b705843908355a89648017f4e597b2bbb (patch) | |
tree | a7be1b62d8f381dc46a2f8e1ef991c72c360a190 | |
parent | 895294e51d33039c1e718d2be88a9863670ac4d6 (diff) | |
download | glibc-2213b37b705843908355a89648017f4e597b2bbb.zip glibc-2213b37b705843908355a89648017f4e597b2bbb.tar.gz glibc-2213b37b705843908355a89648017f4e597b2bbb.tar.bz2 |
libio: handle opening a file when all files are closed (bug 31963)
_IO_list_all becomes NULL when all files (including standard files) are
closed.
-rw-r--r-- | libio/Makefile | 1 | ||||
-rw-r--r-- | libio/genops.c | 3 | ||||
-rw-r--r-- | libio/tst-closeall.c | 34 |
3 files changed, 37 insertions, 1 deletions
diff --git a/libio/Makefile b/libio/Makefile index 8720381..6a507b6 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -91,6 +91,7 @@ tests = \ tst-bz24051 \ tst-bz24153 \ tst-bz28828 \ + tst-closeall \ tst-eof \ tst-ext \ tst-ext2 \ diff --git a/libio/genops.c b/libio/genops.c index 994ee9c..99f5e80 100644 --- a/libio/genops.c +++ b/libio/genops.c @@ -119,7 +119,8 @@ _IO_link_in (struct _IO_FILE_plus *fp) if (_IO_vtable_offset ((FILE *) fp) == 0) { fp->file._prevchain = (FILE **) &_IO_list_all; - _IO_list_all->file._prevchain = &fp->file._chain; + if (_IO_list_all != NULL) + _IO_list_all->file._prevchain = &fp->file._chain; } _IO_list_all = fp; #ifdef _IO_MTSAFE_IO diff --git a/libio/tst-closeall.c b/libio/tst-closeall.c new file mode 100644 index 0000000..34f5246 --- /dev/null +++ b/libio/tst-closeall.c @@ -0,0 +1,34 @@ +/* Test that opening a file when all files are closed does not crash (bug 31963) + Copyright (C) 2024 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <support/check.h> +#include <support/xstdio.h> + +static int +do_test (void) +{ + xfclose (stdin); + xfclose (stdout); + xfclose (stderr); + FILE *f = xfopen ("/dev/null", "w"); + fprintf (f, "final\n"); + xfclose (f); + return 0; +} + +#include <support/test-driver.c> |