forked from rpms/glibc
		
	Fix memory leak after fdopen seek failure (RHEL-66253)
Resolves: RHEL-66253
This commit is contained in:
		
							parent
							
								
									c6a316c547
								
							
						
					
					
						commit
						0ce6757412
					
				
							
								
								
									
										140
									
								
								glibc-RHEL-66253-1.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								glibc-RHEL-66253-1.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,140 @@ | ||||
| commit ddf71c550a5940deca74cc676f1cae134a891717 | ||||
| Author: H.J. Lu <hjl.tools@gmail.com> | ||||
| Date:   Tue Apr 30 09:21:16 2024 -0700 | ||||
| 
 | ||||
|     libio: Sort test variables in Makefile | ||||
|      | ||||
|     Sort test variables in libio/Makefile using scripts/sort-makefile-lines.py. | ||||
|     Reviewed-by: Sunil K Pandey <skpgkp2@gmail.com> | ||||
| 
 | ||||
| Conflicts: | ||||
| 	libio/Makefile | ||||
| 	  (missing tst-bz28828 downstream) | ||||
| 
 | ||||
| diff --git a/libio/Makefile b/libio/Makefile
 | ||||
| index 10c2ed140a855877..31e27b022c73669a 100644
 | ||||
| --- a/libio/Makefile
 | ||||
| +++ b/libio/Makefile
 | ||||
| @@ -51,22 +51,75 @@ routines	:=							      \
 | ||||
|  									      \ | ||||
|  	libc_fatal fmemopen oldfmemopen vtables | ||||
|   | ||||
| -tests = tst_swprintf tst_wprintf tst_swscanf tst_wscanf tst_getwc tst_putwc   \
 | ||||
| -	tst_wprintf2 tst-widetext test-fmemopen tst-ext tst-ext2 \
 | ||||
| -	tst-fgetws tst-ungetwc1 tst-ungetwc2 tst-swscanf tst-sscanf	      \
 | ||||
| -	tst-mmap-setvbuf bug-ungetwc1 bug-ungetwc2 tst-atime tst-eof          \
 | ||||
| -	tst-freopen bug-rewind bug-rewind2 bug-ungetc bug-fseek \
 | ||||
| -	tst-mmap-eofsync tst-mmap-fflushsync bug-mmap-fflush \
 | ||||
| -	tst-mmap2-eofsync tst-mmap-offend bug-fopena+ bug-wfflush \
 | ||||
| -	bug-ungetc2 bug-ftell bug-ungetc3 bug-ungetc4 tst-fopenloc2 \
 | ||||
| -	tst-memstream1 tst-memstream2 tst-memstream3 tst-memstream4 \
 | ||||
| -	tst-wmemstream1 tst-wmemstream2 tst-wmemstream3 tst-wmemstream4 \
 | ||||
| -	tst-wmemstream5 bug-memstream1 bug-wmemstream1 \
 | ||||
| -	tst-setvbuf1 tst-popen1 tst-fgetwc bug-wsetpos tst-fseek \
 | ||||
| -	tst-fwrite-error tst-ftell-partial-wide tst-ftell-active-handler \
 | ||||
| -	tst-ftell-append tst-fputws tst-bz22415 tst-fgetc-after-eof \
 | ||||
| -	tst-sprintf-ub tst-sprintf-chk-ub tst-bz24051 tst-bz24153 \
 | ||||
| -	tst-wfile-sync tst-getdelim
 | ||||
| +tests = \
 | ||||
| +  bug-fopena+ \
 | ||||
| +  bug-fseek \
 | ||||
| +  bug-ftell \
 | ||||
| +  bug-memstream1 \
 | ||||
| +  bug-mmap-fflush \
 | ||||
| +  bug-rewind \
 | ||||
| +  bug-rewind2 \
 | ||||
| +  bug-ungetc \
 | ||||
| +  bug-ungetc2 \
 | ||||
| +  bug-ungetc3 \
 | ||||
| +  bug-ungetc4 \
 | ||||
| +  bug-ungetwc1 \
 | ||||
| +  bug-ungetwc2 \
 | ||||
| +  bug-wfflush \
 | ||||
| +  bug-wmemstream1 \
 | ||||
| +  bug-wsetpos \
 | ||||
| +  test-fmemopen \
 | ||||
| +  tst-atime \
 | ||||
| +  tst-bz22415 \
 | ||||
| +  tst-bz24051 \
 | ||||
| +  tst-bz24153 \
 | ||||
| +  tst-eof \
 | ||||
| +  tst-ext \
 | ||||
| +  tst-ext2 \
 | ||||
| +  tst-fgetc-after-eof \
 | ||||
| +  tst-fgetwc \
 | ||||
| +  tst-fgetws \
 | ||||
| +  tst-fopenloc2 \
 | ||||
| +  tst-fputws \
 | ||||
| +  tst-freopen \
 | ||||
| +  tst-fseek \
 | ||||
| +  tst-ftell-active-handler \
 | ||||
| +  tst-ftell-append \
 | ||||
| +  tst-ftell-partial-wide \
 | ||||
| +  tst-fwrite-error \
 | ||||
| +  tst-getdelim \
 | ||||
| +  tst-memstream1 \
 | ||||
| +  tst-memstream2 \
 | ||||
| +  tst-memstream3 \
 | ||||
| +  tst-memstream4 \
 | ||||
| +  tst-mmap-eofsync \
 | ||||
| +  tst-mmap-fflushsync \
 | ||||
| +  tst-mmap-offend \
 | ||||
| +  tst-mmap-setvbuf \
 | ||||
| +  tst-mmap2-eofsync \
 | ||||
| +  tst-popen1 \
 | ||||
| +  tst-setvbuf1 \
 | ||||
| +  tst-sprintf-chk-ub \
 | ||||
| +  tst-sprintf-ub \
 | ||||
| +  tst-sscanf \
 | ||||
| +  tst-swscanf \
 | ||||
| +  tst-ungetwc1 \
 | ||||
| +  tst-ungetwc2 \
 | ||||
| +  tst-wfile-sync \
 | ||||
| +  tst-widetext \
 | ||||
| +  tst-wmemstream1 \
 | ||||
| +  tst-wmemstream2 \
 | ||||
| +  tst-wmemstream3 \
 | ||||
| +  tst-wmemstream4 \
 | ||||
| +  tst-wmemstream5 \
 | ||||
| +  tst_getwc \
 | ||||
| +  tst_putwc \
 | ||||
| +  tst_swprintf \
 | ||||
| +  tst_swscanf \
 | ||||
| +  tst_wprintf \
 | ||||
| +  tst_wprintf2 \
 | ||||
| +  tst_wscanf \
 | ||||
| +  # tests
 | ||||
|   | ||||
|  tests-internal = tst-vtables tst-vtables-interposed | ||||
|   | ||||
| @@ -200,16 +253,26 @@ tests-special += $(objpfx)tst-fopenloc-cmp.out $(objpfx)tst-fopenloc-mem.out \
 | ||||
|  		 $(objpfx)tst-bz24228-mem.out | ||||
|  endif | ||||
|   | ||||
| -tests += tst-cleanup-default tst-cleanup-default-static
 | ||||
| +tests += \
 | ||||
| +  tst-cleanup-default \
 | ||||
| +  tst-cleanup-default-static \
 | ||||
| +  # tests
 | ||||
|  tests-static += tst-cleanup-default-static | ||||
|  tests-special += $(objpfx)tst-cleanup-default-cmp.out $(objpfx)tst-cleanup-default-static-cmp.out | ||||
|  LDFLAGS-tst-cleanup-default = -Wl,--gc-sections | ||||
|  LDFLAGS-tst-cleanup-default-static = -Wl,--gc-sections | ||||
|   | ||||
|  ifeq ($(have-gnu-retain)$(have-z-start-stop-gc),yesyes) | ||||
| -tests += tst-cleanup-start-stop-gc tst-cleanup-start-stop-gc-static \
 | ||||
| -		tst-cleanup-nostart-stop-gc tst-cleanup-nostart-stop-gc-static
 | ||||
| -tests-static += tst-cleanup-start-stop-gc-static tst-cleanup-nostart-stop-gc-static
 | ||||
| +tests += \
 | ||||
| +  tst-cleanup-nostart-stop-gc \
 | ||||
| +  tst-cleanup-nostart-stop-gc-static \
 | ||||
| +  tst-cleanup-start-stop-gc \
 | ||||
| +  tst-cleanup-start-stop-gc-static \
 | ||||
| +  # tests
 | ||||
| +tests-static += \
 | ||||
| +  tst-cleanup-nostart-stop-gc-static \
 | ||||
| +  tst-cleanup-start-stop-gc-static \
 | ||||
| +  # tests-static
 | ||||
|  tests-special += $(objpfx)tst-cleanup-start-stop-gc-cmp.out \ | ||||
|  		$(objpfx)tst-cleanup-start-stop-gc-static-cmp.out \ | ||||
|  		$(objpfx)tst-cleanup-nostart-stop-gc-cmp.out \ | ||||
							
								
								
									
										28
									
								
								glibc-RHEL-66253-2.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								glibc-RHEL-66253-2.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| commit b2c3ee3724900975deaf5eae57640bb0c2d7315e | ||||
| Author: Andreas Schwab <schwab@suse.de> | ||||
| Date:   Tue Jun 4 11:01:11 2024 +0200 | ||||
| 
 | ||||
|     Remove memory leak in fdopen (bug 31840) | ||||
|      | ||||
|     Deallocate the memory for the FILE structure when seeking to the end fails | ||||
|     in append mode. | ||||
|      | ||||
|     Fixes: ea33158c96 ("Fix offset caching for streams and use it for ftell (BZ #16680)") | ||||
| 
 | ||||
| diff --git a/libio/iofdopen.c b/libio/iofdopen.c
 | ||||
| index 498791b2872f4b93..e3596fa4c91644b7 100644
 | ||||
| --- a/libio/iofdopen.c
 | ||||
| +++ b/libio/iofdopen.c
 | ||||
| @@ -156,7 +156,11 @@ _IO_new_fdopen (int fd, const char *mode)
 | ||||
|      { | ||||
|        off64_t new_pos = _IO_SYSSEEK (&new_f->fp.file, 0, _IO_seek_end); | ||||
|        if (new_pos == _IO_pos_BAD && errno != ESPIPE) | ||||
| -	return NULL;
 | ||||
| +	{
 | ||||
| +	  _IO_un_link (&new_f->fp);
 | ||||
| +	  free (new_f);
 | ||||
| +	  return NULL;
 | ||||
| +	}
 | ||||
|      } | ||||
|    return &new_f->fp.file; | ||||
|  } | ||||
							
								
								
									
										120
									
								
								glibc-RHEL-66253-3.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								glibc-RHEL-66253-3.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | ||||
| commit d0106b6ae26c8cc046269358a77188105c99d5e3 | ||||
| Author: Florian Weimer <fweimer@redhat.com> | ||||
| Date:   Tue Jun 4 14:37:35 2024 +0200 | ||||
| 
 | ||||
|     libio: Test for fdopen memory leak without SEEK_END support (bug 31840) | ||||
|      | ||||
|     The bug report used /dev/mem, but /proc/self/mem works as well | ||||
|     (if available). | ||||
| 
 | ||||
| diff --git a/libio/Makefile b/libio/Makefile
 | ||||
| index 31e27b022c73669a..418102c4c0d8c25a 100644
 | ||||
| --- a/libio/Makefile
 | ||||
| +++ b/libio/Makefile
 | ||||
| @@ -76,6 +76,7 @@ tests = \
 | ||||
|    tst-eof \ | ||||
|    tst-ext \ | ||||
|    tst-ext2 \ | ||||
| +  tst-fdopen-seek-failure \
 | ||||
|    tst-fgetc-after-eof \ | ||||
|    tst-fgetwc \ | ||||
|    tst-fgetws \ | ||||
| @@ -220,6 +221,9 @@ tst_wprintf2-ARGS = "Some Text"
 | ||||
|   | ||||
|  test-fmemopen-ENV = MALLOC_TRACE=$(objpfx)test-fmemopen.mtrace \ | ||||
|  		    LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so | ||||
| +tst-fdopen-seek-failure-ENV = \
 | ||||
| +  MALLOC_TRACE=$(objpfx)tst-fdopen-seek-failure.mtrace \
 | ||||
| +  LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so
 | ||||
|  tst-fopenloc-ENV = MALLOC_TRACE=$(objpfx)tst-fopenloc.mtrace \ | ||||
|  		   LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so | ||||
|  tst-bz22415-ENV = MALLOC_TRACE=$(objpfx)tst-bz22415.mtrace \ | ||||
| @@ -228,6 +232,7 @@ tst-bz24228-ENV = MALLOC_TRACE=$(objpfx)tst-bz24228.mtrace \
 | ||||
|  		  LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so | ||||
|   | ||||
|  generated += test-fmemopen.mtrace test-fmemopen.check | ||||
| +generated += tst-fdopen-seek-failure.mtrace tst-fdopen-seek-failure.check
 | ||||
|  generated += tst-fopenloc.mtrace tst-fopenloc.check | ||||
|  generated += tst-bz22415.mtrace tst-bz22415.check | ||||
|   | ||||
| @@ -244,8 +249,12 @@ shared-only-routines = oldiofopen oldiofdopen oldiofclose oldfileops	\
 | ||||
|  		       oldiofsetpos64 | ||||
|   | ||||
|  ifeq ($(run-built-tests),yes) | ||||
| -tests-special += $(objpfx)test-freopen.out $(objpfx)test-fmemopen-mem.out \
 | ||||
| -		 $(objpfx)tst-bz22415-mem.out
 | ||||
| +tests-special += \
 | ||||
| +  $(objpfx)test-fmemopen-mem.out \
 | ||||
| +  $(objpfx)test-freopen.out \
 | ||||
| +  $(objpfx)tst-bz22415-mem.out \
 | ||||
| +  $(objpfx)tst-fdopen-seek-failure-mem.out \
 | ||||
| +  # tests-special
 | ||||
|  ifeq (yes,$(build-shared)) | ||||
|  # Run tst-fopenloc-cmp.out and tst-openloc-mem.out only if shared | ||||
|  # library is enabled since they depend on tst-fopenloc.out. | ||||
| @@ -333,6 +342,11 @@ $(objpfx)test-fmemopen-mem.out: $(objpfx)test-fmemopen.out
 | ||||
|  	$(common-objpfx)malloc/mtrace $(objpfx)test-fmemopen.mtrace > $@; \ | ||||
|  	$(evaluate-test) | ||||
|   | ||||
| +$(objpfx)tst-fdopen-seek-failure-mem.out: $(objpfx)tst-fdopen-seek-failure.out
 | ||||
| +	$(common-objpfx)malloc/mtrace \
 | ||||
| +	  $(objpfx)tst-fdopen-seek-failure.mtrace > $@; \
 | ||||
| +	$(evaluate-test)
 | ||||
| +
 | ||||
|  $(objpfx)tst-fopenloc-mem.out: $(objpfx)tst-fopenloc.out | ||||
|  	$(common-objpfx)malloc/mtrace $(objpfx)tst-fopenloc.mtrace > $@; \ | ||||
|  	$(evaluate-test) | ||||
| diff --git a/libio/tst-fdopen-seek-failure.c b/libio/tst-fdopen-seek-failure.c
 | ||||
| new file mode 100644 | ||||
| index 0000000000000000..5c4d40ab34158571
 | ||||
| --- /dev/null
 | ||||
| +++ b/libio/tst-fdopen-seek-failure.c
 | ||||
| @@ -0,0 +1,48 @@
 | ||||
| +/* Test for fdopen memory leak without SEEK_END support (bug 31840).
 | ||||
| +   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 <errno.h>
 | ||||
| +#include <fcntl.h>
 | ||||
| +#include <mcheck.h>
 | ||||
| +#include <stddef.h>
 | ||||
| +#include <stdio.h>
 | ||||
| +#include <support/check.h>
 | ||||
| +#include <support/xunistd.h>
 | ||||
| +#include <unistd.h>
 | ||||
| +
 | ||||
| +static int
 | ||||
| +do_test (void)
 | ||||
| +{
 | ||||
| +  mtrace ();
 | ||||
| +
 | ||||
| +  /* This file is special because it is seekable, but only
 | ||||
| +     with SEEK_SET, not SEEK_END.  */
 | ||||
| +  int fd = open ("/proc/self/mem", O_RDWR);
 | ||||
| +  if (fd < 0)
 | ||||
| +    FAIL_UNSUPPORTED ("/proc/self/mem not found: %m");
 | ||||
| +  FILE *fp = fdopen (fd, "a");
 | ||||
| +  /* The fdopen call should have failed because it tried to use
 | ||||
| +     SEEK_END.  */
 | ||||
| +  TEST_VERIFY (fp == NULL);
 | ||||
| +  TEST_COMPARE (errno, EINVAL);
 | ||||
| +  xclose (fd);
 | ||||
| +  return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +#include <support/test-driver.c>
 | ||||
| @ -157,7 +157,7 @@ end \ | ||||
| Summary: The GNU libc libraries | ||||
| Name: glibc | ||||
| Version: %{glibcversion} | ||||
| Release: 136%{?dist} | ||||
| Release: 137%{?dist} | ||||
| 
 | ||||
| # In general, GPLv2+ is used by programs, LGPLv2+ is used for | ||||
| # libraries. | ||||
| @ -910,6 +910,9 @@ Patch671: glibc-RHEL-50662-4.patch | ||||
| Patch672: glibc-RHEL-50662-5.patch | ||||
| Patch673: glibc-RHEL-50662-6.patch | ||||
| Patch674: glibc-RHEL-46724.patch | ||||
| Patch675: glibc-RHEL-66253-1.patch | ||||
| Patch676: glibc-RHEL-66253-2.patch | ||||
| Patch677: glibc-RHEL-66253-3.patch | ||||
| 
 | ||||
| ############################################################################## | ||||
| # Continued list of core "glibc" package information: | ||||
| @ -3069,6 +3072,9 @@ update_gconv_modules_cache () | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Thu Nov  7 2024 Florian Weimer <fweimer@redhat.com> - 2.34-137 | ||||
| - Fix memory leak after fdopen seek failure (RHEL-66253) | ||||
| 
 | ||||
| * Thu Nov  7 2024 Florian Weimer <fweimer@redhat.com> - 2.34-136 | ||||
| - Document rules for mixing stdio streams and file descriptors (RHEL-46724) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user