Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2230320/?format=api
{ "id": 2230320, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230320/?format=api", "web_url": "http://patchwork.ozlabs.org/project/glibc/patch/20260429145934.278803-2-fberat@redhat.com/", "project": { "id": 41, "url": "http://patchwork.ozlabs.org/api/1.1/projects/41/?format=api", "name": "GNU C Library", "link_name": "glibc", "list_id": "libc-alpha.sourceware.org", "list_email": "libc-alpha@sourceware.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20260429145934.278803-2-fberat@redhat.com>", "date": "2026-04-29T14:59:33", "name": "[1/2] libio: Fix gconv module reference counter overflow in swscanf", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "04c640d82783c029783271d67da60c676e84dbbb", "submitter": { "id": 84672, "url": "http://patchwork.ozlabs.org/api/1.1/people/84672/?format=api", "name": "Frédéric Bérat", "email": "fberat@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/glibc/patch/20260429145934.278803-2-fberat@redhat.com/mbox/", "series": [ { "id": 502092, "url": "http://patchwork.ozlabs.org/api/1.1/series/502092/?format=api", "web_url": "http://patchwork.ozlabs.org/project/glibc/list/?series=502092", "date": "2026-04-29T14:59:33", "name": "Fix gconv reference count overflow in swscanf", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/502092/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2230320/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2230320/checks/", "tags": {}, "headers": { "Return-Path": "<libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "libc-alpha@sourceware.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "libc-alpha@sourceware.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=R8A+BnBG;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=R8A+BnBG", "sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com", "sourceware.org; spf=pass smtp.mailfrom=redhat.com", "server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5L875NTjz1yHX\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 01:00:23 +1000 (AEST)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id D83724BA23CB\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 15:00:21 +0000 (GMT)", "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 6D67F4BA2E2E\n for <libc-alpha@sourceware.org>; Wed, 29 Apr 2026 14:59:50 +0000 (GMT)", "from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-433-HmiBcMq3NVCknNr7cnJIIg-1; Wed,\n 29 Apr 2026 10:59:49 -0400", "from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 4740F195608F; Wed, 29 Apr 2026 14:59:44 +0000 (UTC)", "from Nymeria-redhat.redhat.com (unknown [10.44.32.149])\n by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with\n ESMTPS\n id A201A1800480; Wed, 29 Apr 2026 14:59:42 +0000 (UTC)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org D83724BA23CB", "OpenDKIM Filter v2.11.0 sourceware.org 6D67F4BA2E2E" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 6D67F4BA2E2E", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 6D67F4BA2E2E", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777474790; cv=none;\n b=KlCdwty/SFYH9vYxBs2Nkux5U5Uz47c7a3ceLr0BWjqp2rxp+N2GWSA+Gx+iBs9ljwUr8PKSs3oMjHTESRjf6qwEIBvvOPO6fa1UDRV2KF2M53K69XBtmhePGV7MGvaYj/CVMECrzaUVCjIeuhvqH3xymjK7lf/bOvKl5PdK6tg=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777474790; c=relaxed/simple;\n bh=20HzRTC0k+cc+pR2Oql56w39UaqHMBJCsaLihYFfYaQ=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=aEBigrzemaLMoylEj6W5aWH5NNB0ktzgL7U0lQAnSizsJSCpMIYPygWgKEZN37i/HZIFbYqWfqt7gaoBw43Swjm3pvw3r+0Ah+n9kS6SafbEdNTrpOUOtp5EPcoO1sYeaXhbczGS/disLPUBkIHC9Rkk9oWF2ZsCMH6TzKqAbew=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777474790;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=pZeV9YLpI2mKERts7jQvSHKyXhY2oFfrY6XesaX46D4=;\n b=R8A+BnBGBkD1eEpy9cfkSRXtGBZTJAB+xFr8qmYBlJ+VkB3C1gKBJPK3kNb0uOogglXNlU\n NWOLiEa/Y6sFNNPDvxf9NaJSLyj2ag1ZkamUsF0CeHdKxqcoYssXxTPLZk++9rXYrT3AYO\n RfYSUP+2S3ZNJdL0CzalOTvcPHLNy80=", "X-MC-Unique": "HmiBcMq3NVCknNr7cnJIIg-1", "X-Mimecast-MFC-AGG-ID": "HmiBcMq3NVCknNr7cnJIIg_1777474784", "From": "=?utf-8?b?RnLDqWTDqXJpYyBCw6lyYXQ=?= <fberat@redhat.com>", "To": "libc-alpha@sourceware.org, dj@redhat.com, fweimer@redhat.com,\n adhemerval.zanella@linaro.org", "Subject": "[PATCH 1/2] libio: Fix gconv module reference counter overflow in\n swscanf", "Date": "Wed, 29 Apr 2026 16:59:33 +0200", "Message-ID": "<20260429145934.278803-2-fberat@redhat.com>", "In-Reply-To": "<20260429145934.278803-1-fberat@redhat.com>", "References": "<20260429145934.278803-1-fberat@redhat.com>", "MIME-Version": "1.0", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.93", "X-Mimecast-Spam-Score": "0", "X-Mimecast-MFC-PROC-ID": "PqO6qr-GbKQrY0V5fluZrGMqkzFz0K2iPIetBGHc5Rw_1777474784", "X-Mimecast-Originator": "redhat.com", "Content-Transfer-Encoding": "8bit", "content-type": "text/plain; charset=\"US-ASCII\"; x-default=true", "X-BeenThere": "libc-alpha@sourceware.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Libc-alpha mailing list <libc-alpha.sourceware.org>", "List-Unsubscribe": "<https://sourceware.org/mailman/options/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe>", "List-Archive": "<https://sourceware.org/pipermail/libc-alpha/>", "List-Post": "<mailto:libc-alpha@sourceware.org>", "List-Help": "<mailto:libc-alpha-request@sourceware.org?subject=help>", "List-Subscribe": "<https://sourceware.org/mailman/listinfo/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=subscribe>", "Errors-To": "libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org" }, "content": "The swscanf family of functions creates a wide-oriented FILE stream\non the stack. Initialization of this stream invokes `_IO_fwide`, which\nclones the global locale's gconv transformation steps via\n`__wcsmbs_clone_conv`. This increments the reference counter (`__counter`)\nof the gconv module.\n\nBecause the FILE stream is stack-allocated, `fclose` cannot be called,\nand so `__gconv_release_step` is never invoked. The counter leaks,\neventually hitting the 32-bit integer overflow limit and aborting the\nprocess.\n\nTo resolve this, we introduce `_IO_wstrfile_fclose_stack`, a dedicated\ncleanup function for stack-allocated FILE streams. This function invokes\n`_IO_FINISH` and correctly releases the gconv steps via\n`__gconv_release_step` without attempting to `free` the FILE pointer.\nThis cleanup function is then hooked into all variants of swscanf right\nbefore they return.\n---\n libio/iofwide.c | 15 +++++++++++++++\n libio/iovswscanf.c | 4 +++-\n libio/libioP.h | 1 +\n libio/swscanf.c | 2 +-\n .../ldbl-128ibm-compat/ieee128-isoc23_swscanf.c | 2 +-\n .../ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c | 4 +++-\n .../ldbl-128ibm-compat/ieee128-isoc99_swscanf.c | 2 +-\n .../ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c | 4 +++-\n .../ieee754/ldbl-128ibm-compat/ieee128-swscanf.c | 2 +-\n .../ieee754/ldbl-128ibm-compat/ieee128-vswscanf.c | 4 +++-\n sysdeps/ieee754/ldbl-opt/nldbl-compat.c | 12 +++++++++---\n wcsmbs/isoc23_swscanf.c | 2 +-\n wcsmbs/isoc23_vswscanf.c | 4 +++-\n wcsmbs/isoc99_swscanf.c | 2 +-\n wcsmbs/isoc99_vswscanf.c | 4 +++-\n 15 files changed, 49 insertions(+), 15 deletions(-)", "diff": "diff --git a/libio/iofwide.c b/libio/iofwide.c\nindex 8e71fdd21b..d016aa33ea 100644\n--- a/libio/iofwide.c\n+++ b/libio/iofwide.c\n@@ -251,3 +251,18 @@ __libio_codecvt_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,\n \n return result;\n }\n+\n+void\n+_IO_wstrfile_fclose_stack (FILE *fp)\n+{\n+ _IO_FINISH (fp);\n+ if (fp->_mode > 0)\n+ {\n+ struct _IO_codecvt *cc = fp->_codecvt;\n+\n+ __libc_lock_lock (__gconv_lock);\n+ __gconv_release_step (cc->__cd_in.step);\n+ __gconv_release_step (cc->__cd_out.step);\n+ __libc_lock_unlock (__gconv_lock);\n+ }\n+}\ndiff --git a/libio/iovswscanf.c b/libio/iovswscanf.c\nindex a97f4eed1e..986d94178d 100644\n--- a/libio/iovswscanf.c\n+++ b/libio/iovswscanf.c\n@@ -38,6 +38,8 @@ __vswscanf (const wchar_t *string, const wchar_t *format, va_list args)\n _IO_strfile sf;\n struct _IO_wide_data wd;\n FILE *f = _IO_strfile_readw (&sf, &wd, string);\n- return __vfwscanf_internal (f, format, args, 0);\n+ int done = __vfwscanf_internal (f, format, args, 0);\n+ _IO_wstrfile_fclose_stack (f);\n+ return done;\n }\n ldbl_weak_alias (__vswscanf, vswscanf)\ndiff --git a/libio/libioP.h b/libio/libioP.h\nindex 1485d22619..1d4217e82a 100644\n--- a/libio/libioP.h\n+++ b/libio/libioP.h\n@@ -645,6 +645,7 @@ extern FILE* _IO_new_file_fopen (FILE *, const char *, const char *,\n \t\t\t\t int);\n extern void _IO_no_init (FILE *, int, int, struct _IO_wide_data *,\n \t\t\t const struct _IO_jump_t *) __THROW;\n+extern void _IO_wstrfile_fclose_stack (FILE *) attribute_hidden;\n extern void _IO_new_file_init_internal (struct _IO_FILE_plus *)\n __THROW attribute_hidden;\n extern FILE* _IO_new_file_setbuf (FILE *, char *, ssize_t);\ndiff --git a/libio/swscanf.c b/libio/swscanf.c\nindex d36ef48258..583253a7dc 100644\n--- a/libio/swscanf.c\n+++ b/libio/swscanf.c\n@@ -37,7 +37,7 @@ __swscanf (const wchar_t *s, const wchar_t *format, ...)\n va_start (arg, format);\n done = __vfwscanf_internal (f, format, arg, 0);\n va_end (arg);\n-\n+ _IO_wstrfile_fclose_stack (f);\n return done;\n }\n ldbl_strong_alias (__swscanf, swscanf)\ndiff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c\nindex 6b3915357f..2e95cdf010 100644\n--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c\n+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_swscanf.c\n@@ -35,7 +35,7 @@ ___ieee128_isoc23_swscanf (const wchar_t *string, const wchar_t *format, ...)\n va_start (ap, format);\n done = __vfwscanf_internal (fp, format, ap, mode_flags);\n va_end (ap);\n-\n+ _IO_wstrfile_fclose_stack (fp);\n return done;\n }\n strong_alias (___ieee128_isoc23_swscanf, __isoc23_swscanfieee128)\ndiff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c\nindex 295321147c..857903b2a6 100644\n--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c\n+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc23_vswscanf.c\n@@ -28,6 +28,8 @@ ___ieee128_isoc23_vswscanf (wchar_t *string, const wchar_t *format, va_list ap)\n FILE *fp = _IO_strfile_readw (&sf, &wd, string);\n int mode_flags =\n SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST | SCANF_LDBL_USES_FLOAT128;\n- return __vfwscanf_internal (fp, format, ap, mode_flags);\n+ int done = __vfwscanf_internal (fp, format, ap, mode_flags);\n+ _IO_wstrfile_fclose_stack (fp);\n+ return done;\n }\n strong_alias (___ieee128_isoc23_vswscanf, __isoc23_vswscanfieee128)\ndiff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c\nindex 19b71940dd..2280bae1d0 100644\n--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c\n+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_swscanf.c\n@@ -34,7 +34,7 @@ ___ieee128_isoc99_swscanf (const wchar_t *string, const wchar_t *format, ...)\n va_start (ap, format);\n done = __vfwscanf_internal (fp, format, ap, mode_flags);\n va_end (ap);\n-\n+ _IO_wstrfile_fclose_stack (fp);\n return done;\n }\n strong_alias (___ieee128_isoc99_swscanf, __isoc99_swscanfieee128)\ndiff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c\nindex a1b51cb5b6..21cf25610a 100644\n--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c\n+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-isoc99_vswscanf.c\n@@ -27,6 +27,8 @@ ___ieee128_isoc99_vswscanf (wchar_t *string, const wchar_t *format, va_list ap)\n struct _IO_wide_data wd;\n FILE *fp = _IO_strfile_readw (&sf, &wd, string);\n int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;\n- return __vfwscanf_internal (fp, format, ap, mode_flags);\n+ int done = __vfwscanf_internal (fp, format, ap, mode_flags);\n+ _IO_wstrfile_fclose_stack (fp);\n+ return done;\n }\n strong_alias (___ieee128_isoc99_vswscanf, __isoc99_vswscanfieee128)\ndiff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swscanf.c\nindex 7124ecb67c..fdfdf2b65c 100644\n--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swscanf.c\n+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-swscanf.c\n@@ -34,7 +34,7 @@ ___ieee128_swscanf (const wchar_t *string, const wchar_t *format, ...)\n done = __vfwscanf_internal (fp, format, ap,\n \t\t\t SCANF_LDBL_USES_FLOAT128);\n va_end (ap);\n-\n+ _IO_wstrfile_fclose_stack (fp);\n return done;\n }\n strong_alias (___ieee128_swscanf, __swscanfieee128)\ndiff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswscanf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswscanf.c\nindex 8294582c48..b860a8e87d 100644\n--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswscanf.c\n+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vswscanf.c\n@@ -27,6 +27,8 @@ ___ieee128_vswscanf (const wchar_t *string, const wchar_t *format,\n _IO_strfile sf;\n struct _IO_wide_data wd;\n FILE *fp = _IO_strfile_readw (&sf, &wd, string);\n- return __vfwscanf_internal (fp, format, ap, SCANF_LDBL_USES_FLOAT128);\n+ int done = __vfwscanf_internal (fp, format, ap, SCANF_LDBL_USES_FLOAT128);\n+ _IO_wstrfile_fclose_stack (fp);\n+ return done;\n }\n strong_alias (___ieee128_vswscanf, __vswscanfieee128)\ndiff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c\nindex dcd5649200..e239cd5bc5 100644\n--- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.c\n+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.c\n@@ -391,7 +391,9 @@ __nldbl_vswscanf (const wchar_t *s, const wchar_t *fmt, va_list ap)\n struct _IO_wide_data wd;\n FILE *f = _IO_strfile_readw (&sf, &wd, s);\n \n- return __vfwscanf_internal (f, fmt, ap, SCANF_LDBL_IS_DBL);\n+ int ret = __vfwscanf_internal (f, fmt, ap, SCANF_LDBL_IS_DBL);\n+ _IO_wstrfile_fclose_stack (f);\n+ return ret;\n }\n libc_hidden_def (__nldbl_vswscanf)\n \n@@ -955,7 +957,9 @@ __nldbl___isoc99_vswscanf (const wchar_t *s, const wchar_t *fmt, va_list ap)\n struct _IO_wide_data wd;\n FILE *f = _IO_strfile_readw (&sf, &wd, s);\n \n- return __vfwscanf_internal (f, fmt, ap, SCANF_LDBL_IS_DBL | SCANF_ISOC99_A);\n+ int ret = __vfwscanf_internal (f, fmt, ap, SCANF_LDBL_IS_DBL | SCANF_ISOC99_A);\n+ _IO_wstrfile_fclose_stack (f);\n+ return ret;\n }\n libc_hidden_def (__nldbl___isoc99_vswscanf)\n \n@@ -1115,9 +1119,11 @@ __nldbl___isoc23_vswscanf (const wchar_t *s, const wchar_t *fmt, va_list ap)\n struct _IO_wide_data wd;\n FILE *f = _IO_strfile_readw (&sf, &wd, s);\n \n- return __vfwscanf_internal (f, fmt, ap,\n+ int ret = __vfwscanf_internal (f, fmt, ap,\n \t\t\t SCANF_LDBL_IS_DBL | SCANF_ISOC99_A\n \t\t\t | SCANF_ISOC23_BIN_CST);\n+ _IO_wstrfile_fclose_stack (f);\n+ return ret;\n }\n libc_hidden_def (__nldbl___isoc23_vswscanf)\n \ndiff --git a/wcsmbs/isoc23_swscanf.c b/wcsmbs/isoc23_swscanf.c\nindex 66b5290b3c..568ab138b4 100644\n--- a/wcsmbs/isoc23_swscanf.c\n+++ b/wcsmbs/isoc23_swscanf.c\n@@ -33,6 +33,6 @@ __isoc23_swscanf (const wchar_t *s, const wchar_t *format, ...)\n done = __vfwscanf_internal (f, format, arg,\n \t\t\t SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);\n va_end (arg);\n-\n+ _IO_wstrfile_fclose_stack (f);\n return done;\n }\ndiff --git a/wcsmbs/isoc23_vswscanf.c b/wcsmbs/isoc23_vswscanf.c\nindex d84efb9350..89b7241a7a 100644\n--- a/wcsmbs/isoc23_vswscanf.c\n+++ b/wcsmbs/isoc23_vswscanf.c\n@@ -24,7 +24,9 @@ __isoc23_vswscanf (const wchar_t *string, const wchar_t *format, va_list args)\n _IO_strfile sf;\n struct _IO_wide_data wd;\n FILE *f = _IO_strfile_readw (&sf, &wd, string);\n- return __vfwscanf_internal (f, format, args,\n+ int done = __vfwscanf_internal (f, format, args,\n \t\t\t SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);\n+ _IO_wstrfile_fclose_stack (f);\n+ return done;\n }\n libc_hidden_def (__isoc23_vswscanf)\ndiff --git a/wcsmbs/isoc99_swscanf.c b/wcsmbs/isoc99_swscanf.c\nindex 493fe01520..c94f19ca41 100644\n--- a/wcsmbs/isoc99_swscanf.c\n+++ b/wcsmbs/isoc99_swscanf.c\n@@ -32,6 +32,6 @@ __isoc99_swscanf (const wchar_t *s, const wchar_t *format, ...)\n va_start (arg, format);\n done = __vfwscanf_internal (f, format, arg, SCANF_ISOC99_A);\n va_end (arg);\n-\n+ _IO_wstrfile_fclose_stack (f);\n return done;\n }\ndiff --git a/wcsmbs/isoc99_vswscanf.c b/wcsmbs/isoc99_vswscanf.c\nindex 326f7bfd24..6bc134a807 100644\n--- a/wcsmbs/isoc99_vswscanf.c\n+++ b/wcsmbs/isoc99_vswscanf.c\n@@ -33,6 +33,8 @@ __isoc99_vswscanf (const wchar_t *string, const wchar_t *format, va_list args)\n _IO_strfile sf;\n struct _IO_wide_data wd;\n FILE *f = _IO_strfile_readw (&sf, &wd, string);\n- return __vfwscanf_internal (f, format, args, SCANF_ISOC99_A);\n+ int done = __vfwscanf_internal (f, format, args, SCANF_ISOC99_A);\n+ _IO_wstrfile_fclose_stack (f);\n+ return done;\n }\n libc_hidden_def (__isoc99_vswscanf)\n", "prefixes": [ "1/2" ] }