{"id":2230320,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230320/?format=json","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=json","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=json","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=json","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"]}