Message ID | mvmwmlwgf66.fsf@suse.de |
---|---|
State | New |
Headers | show |
Series | libio: handle opening a file when all files are closed (bug 31963) | expand |
Andreas Schwab <schwab@suse.de> writes: > _IO_list_all becomes NULL when all files (including standard files) are > closed. r-b for either patch (yours or H.J's) > --- > libio/Makefile | 1 + > libio/genops.c | 3 ++- > libio/tst-closeall.c | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 37 insertions(+), 1 deletion(-) > create mode 100644 libio/tst-closeall.c > > diff --git a/libio/Makefile b/libio/Makefile > index 82c7e3ef0b..1f7031066c 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> > -- > 2.45.2
OK for 2.40 with someone's R-B, either this one or HJL's obviously Am Montag, 8. Juli 2024, 15:57:05 MESZ schrieb Andreas Schwab: > _IO_list_all becomes NULL when all files (including standard files) are > closed. > --- > libio/Makefile | 1 + > libio/genops.c | 3 ++- > libio/tst-closeall.c | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 37 insertions(+), 1 deletion(-) > create mode 100644 libio/tst-closeall.c > > diff --git a/libio/Makefile b/libio/Makefile > index 82c7e3ef0b..1f7031066c 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> >
diff --git a/libio/Makefile b/libio/Makefile index 82c7e3ef0b..1f7031066c 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>