From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2178) id 1F7F9395A444; Tue, 4 Jun 2024 14:09:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1F7F9395A444 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1717510185; bh=ol1S/TS5FFfYWKKfCQNK55CY4pmUhaqZKbQWPScoFlQ=; h=From:To:Subject:Date:From; b=ZrNW3EReDPSEdPwdZgGJbJ3LRUcwML5Bvrps+dIKgvbJ/ShXXvta0K697zlxNyn+e sm3vYPeSjuIgWaAE9hLqTz4a8jsYJEdESnMn9gf/baQx3sQo/LYPs0mLkClLuDA+9S IgevPZd7cnzFxQYJtfVXYPvFFStIeddPjpYTYxpQ= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Florian Weimer To: glibc-cvs@sourceware.org Subject: [glibc] libio: Test for fdopen memory leak without SEEK_END support (bug 31840) X-Act-Checkin: glibc X-Git-Author: Florian Weimer X-Git-Refname: refs/heads/master X-Git-Oldrev: b2c3ee3724900975deaf5eae57640bb0c2d7315e X-Git-Newrev: d0106b6ae26c8cc046269358a77188105c99d5e3 Message-Id: <20240604140945.1F7F9395A444@sourceware.org> Date: Tue, 4 Jun 2024 14:09:45 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d0106b6ae26c8cc046269358a77188105c99d5e3 commit d0106b6ae26c8cc046269358a77188105c99d5e3 Author: Florian Weimer 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: --- libio/Makefile | 18 ++++++++++++++-- libio/tst-fdopen-seek-failure.c | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/libio/Makefile b/libio/Makefile index 0c1f16ee3b..f607edbefb 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -94,6 +94,7 @@ tests = \ tst-eof \ tst-ext \ tst-ext2 \ + tst-fdopen-seek-failure \ tst-fgetc-after-eof \ tst-fgetwc \ tst-fgetws \ @@ -250,6 +251,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 \ @@ -258,6 +262,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 @@ -280,8 +285,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. @@ -369,6 +378,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 0000000000..5c4d40ab34 --- /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 + . */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +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