diff --git a/libio/Makefile b/libio/Makefile index 8720381fdc..6a507b67ea 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 994ee9c0b1..99f5e80f20 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 0000000000..34f5246490 --- /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>