From patchwork Wed Sep 2 01:40:28 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Pluzhnikov X-Patchwork-Id: 8551 Received: (qmail 63316 invoked by alias); 2 Sep 2015 01:41:03 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 63305 invoked by uid 89); 2 Sep 2015 01:41:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mail-vk0-f54.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=IGMGOm6mo12Q03r44+LegaNEE2ZtGrjnC9WdSO/Xh6w=; b=Xh6qguBfQKbkd+VNH4Z+OrTFbhw6dH/fwC8YfuFwkNrjeRHRKX8Aa5TWMikpQeeAkF t1BBBfGzoEoB3yZvD/7zBXPEarzMSOBRppUXx23xucfUpxNIa8aQtStOJGFqKqnV6xze A1J7ubU765HRPvGr4+xJfKEbdPbW0jutNE90yG5Gl6Nj0V1ZcDApbkmGT5nDpaNoK+aS X1Hi8CBe64L5tbGiuZVqZT7XiUcG3QYMTIVWF20LNFl77elyLL+5S6qD/bYE/si6KT+p 8rkbOiwahD1Vwdg8KWnmh+LLVDdN2QPbX5CpTGrm7AQPjpJ6qhOrXKUOf435k70zr30b mDpw== X-Gm-Message-State: ALoCoQkBoq2eMb3nJZAXX7jplfJOFDH5klRTF4YzopZqj6kTYQtNuY+SHqGp2smLQ6kR1TJQkSj+ X-Received: by 10.53.2.226 with SMTP id br2mr34064433vdd.2.1441158058494; Tue, 01 Sep 2015 18:40:58 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <1440571295-20230-1-git-send-email-eggert@cs.ucla.edu> <55DFB7C7.50307@redhat.com> <55E06924.2000209@redhat.com> From: Paul Pluzhnikov Date: Tue, 1 Sep 2015 18:40:28 -0700 Message-ID: Subject: Re: [PATCH] Fix memory leak in printf_positional To: Joseph Myers Cc: "Carlos O'Donell" , Paul Eggert , GLIBC Devel On Tue, Sep 1, 2015 at 6:35 PM, Paul Pluzhnikov wrote: > Combined patch attached. Tested on Linux/x86_64. Let's try that again with space after paren. diff --git a/stdio-common/Makefile b/stdio-common/Makefile index d0bf0e1..ad2c8a3 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -57,17 +57,23 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \ bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \ scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24 \ bug-vfprintf-nargs tst-long-dbl-fphex tst-fphex-wide tst-sprintf3 \ - bug25 tst-printf-round bug23-2 bug23-3 bug23-4 bug26 tst-fmemopen3 + bug25 tst-printf-round bug23-2 bug23-3 bug23-4 bug26 tst-fmemopen3 \ + tst-printf-bz18872 test-srcs = tst-unbputc tst-printf ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-unbputc.out $(objpfx)tst-printf.out \ + $(objpfx)tst-printf-bz18872-mem.out \ $(objpfx)tst-setvbuf1-cmp.out +generated += tst-printf-bz18872.mtrace tst-printf-bz18872-mem.out endif include ../Rules +tst-printf-bz18872-ENV = MALLOC_TRACE=$(objpfx)tst-printf-bz18872.mtrace +CFLAGS-tst-printf-bz18872.c += -Wno-format + ifeq ($(run-built-tests),yes) $(objpfx)tst-unbputc.out: tst-unbputc.sh $(objpfx)tst-unbputc $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ @@ -76,6 +82,10 @@ $(objpfx)tst-unbputc.out: tst-unbputc.sh $(objpfx)tst-unbputc $(objpfx)tst-printf.out: tst-printf.sh $(objpfx)tst-printf $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ $(evaluate-test) + +$(objpfx)tst-printf-bz18872-mem.out: $(objpfx)tst-printf-bz18872.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-printf-bz18872.mtrace > $@; \ + $(evaluate-test) endif CFLAGS-vfprintf.c = -Wno-uninitialized diff --git a/stdio-common/tst-printf-bz18872.c b/stdio-common/tst-printf-bz18872.c new file mode 100644 index 0000000..430da52 --- /dev/null +++ b/stdio-common/tst-printf-bz18872.c @@ -0,0 +1,47 @@ +/* Copyright (C) 1991-2015 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 + +/* + Compile do_bz18872 without optimization: GCC 4.9/5.0/6.0 takes a long time + to build this source. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67396 */ +#pragma GCC push_options +#pragma GCC optimize ("-O0") + +static int +do_bz18872 (void) +{ + mtrace (); + +#define A10 "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", +#define S10 "%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s" +#define X10(a) a a a a a a a a a a + + printf ("%1$s" X10 (X10 (X10 (S10))) "%s", X10 (X10 (X10 (A10))) "\n"); + +#undef A10 +#undef S10 +#undef X10 + return 0; +} + +#pragma GCC pop_options + +#define TEST_FUNCTION do_bz18872 () +#include "../test-skeleton.c" diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 0592e70..45c4779 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -2091,6 +2091,10 @@ printf_positional (_IO_FILE *s, const CHAR_T *format, int readonly_format, - specs[nspecs_done].end_of_fmt); } all_done: + if (__glibc_unlikely (specs_malloced)) + free (specs); + if (__glibc_unlikely (args_malloced != NULL)) + free (args_malloced); if (__glibc_unlikely (workstart != NULL)) free (workstart); return done;