From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dmta0003.nifty.com (mta-snd00014.nifty.com [106.153.226.46]) by sourceware.org (Postfix) with ESMTPS id AEE18385802F for ; Wed, 2 Aug 2023 06:39:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AEE18385802F Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=nifty.ne.jp Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=nifty.ne.jp Received: from localhost.localdomain by dmta0003.nifty.com with ESMTP id <20230802063922726.VKZH.106126.localhost.localdomain@nifty.com>; Wed, 2 Aug 2023 15:39:22 +0900 From: Takashi Yano To: newlib@sourceware.org Cc: Takashi Yano , natan_b , Corinna Vinschen Subject: [PATCH v2] newlib: Fix memory leak regarding gdtoa-based _ldtoa_r(). Date: Wed, 2 Aug 2023 15:37:53 +0900 Message-Id: <20230802063753.319-1-takashi.yano@nifty.ne.jp> X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: After the commit a4705d387f78, printf() for floating-point values causes a memory leak. The legacy _ldtoa_r() assumed the char pointer returned will be free'ed by Bfree(). However, gdtoa-based _ldtoa_r() returns the pointer returned by gdtoa() which should be free'ed by freedtoa(). Due to this issue, the caller of _ldtoa_r() fails to free the allocated char buffer. This is the cause of the said memory leak. https://cygwin.com/pipermail/cygwin/2023-July/254054.html This patch makes rv_alloc()/freedtoa() allocate/free the buffer in a compatible way with legacy _ldtoa_r(). Fixes: a4705d387f78 ("ldtoa: Import gdtoa from OpenBSD.") Reported-by: natan_b Reviewed-by: Corinna Vinschen Signed-off-by: Takashi Yano --- newlib/libc/stdlib/gdtoa-dmisc.c | 23 +++++++++++++---------- newlib/libc/stdlib/gdtoa-ldtoa.c | 4 +--- winsup/cygwin/release/3.4.8 | 3 +++ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/newlib/libc/stdlib/gdtoa-dmisc.c b/newlib/libc/stdlib/gdtoa-dmisc.c index 332023dae..f330f8ae7 100644 --- a/newlib/libc/stdlib/gdtoa-dmisc.c +++ b/newlib/libc/stdlib/gdtoa-dmisc.c @@ -46,26 +46,28 @@ rv_alloc(ptr, i) struct _reent *ptr, int i; rv_alloc(struct _reent *ptr, int i) #endif { - int j, k, *r; + int j; + char *r; + /* Allocate buffer in a compatible way with legacy _ldtoa_r(). */ j = sizeof(ULong); - for(k = 0; - sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; - j <<= 1) - k++; - r = (int*)Balloc(ptr, k); + for (_REENT_MP_RESULT_K (ptr) = 0; + sizeof (Bigint) - sizeof (ULong) + j <= i; j <<= 1) + _REENT_MP_RESULT_K (ptr)++; + _REENT_MP_RESULT (ptr) = eBalloc (ptr, _REENT_MP_RESULT_K (ptr)); + r = (char *) _REENT_MP_RESULT (ptr); + if (r == NULL) return ( #ifndef MULTIPLE_THREADS dtoa_result = #endif NULL); - *r = k; return #ifndef MULTIPLE_THREADS dtoa_result = #endif - (char *)(r+1); + r; } char * @@ -100,8 +102,9 @@ freedtoa(ptr, s) struct _reent *ptr, char *s; freedtoa(struct _reent *ptr, char *s) #endif { - Bigint *b = (Bigint *)((int *)s - 1); - b->_maxwds = 1 << (b->_k = *(int*)b); + /* Free buffer allocated in a compatible way with legacy _ldtoa_r(). */ + Bigint *b = (Bigint *)s; + b->_maxwds = 1 << (b->_k = _REENT_MP_RESULT_K (ptr)); Bfree(ptr, b); #ifndef MULTIPLE_THREADS if (s == dtoa_result) diff --git a/newlib/libc/stdlib/gdtoa-ldtoa.c b/newlib/libc/stdlib/gdtoa-ldtoa.c index 14b99042c..09ba6b34b 100644 --- a/newlib/libc/stdlib/gdtoa-ldtoa.c +++ b/newlib/libc/stdlib/gdtoa-ldtoa.c @@ -72,9 +72,7 @@ _ldtoa_r(struct _reent *ptr, /* reentrancy addition to use mprec storage pool */ if (_REENT_MP_RESULT (ptr)) { - _REENT_MP_RESULT (ptr)->_k = _REENT_MP_RESULT_K (ptr); - _REENT_MP_RESULT (ptr)->_maxwds = 1 << _REENT_MP_RESULT_K (ptr); - Bfree (ptr, _REENT_MP_RESULT (ptr)); + freedtoa (ptr, _REENT_MP_RESULT (ptr)); _REENT_MP_RESULT (ptr) = 0; } diff --git a/winsup/cygwin/release/3.4.8 b/winsup/cygwin/release/3.4.8 index d37272eef..448831c65 100644 --- a/winsup/cygwin/release/3.4.8 +++ b/winsup/cygwin/release/3.4.8 @@ -14,3 +14,6 @@ Bug Fixes - Rename internal macros _NL_CTYPE_OUTDIGITSx_MB/WC to GLibc compatible _NL_CTYPE_OUTDIGITx_MB/WC. Addresses: https://cygwin.com/pipermail/cygwin-developers/2023-July/012637.html + +- Fix memory leak in printf() regarding gdtoa-based _ldtoa_r(). + Addresses: https://cygwin.com/pipermail/cygwin/2023-July/254054.html -- 2.39.0