Control: tag -1 confirmed d-i moreinfo

Hi,

On Tue, Jun 30, 2026 at 09:03:48PM +0200, Aurelien Jarno wrote:
> [ Reason ]
> The upstream stable branch received fixes since the latest trixie point
> release, and this update pulls them into the debian package.
> 
> This includes most notably 2 security fixes and one FTBFS when using a 
> kernel from trixie-backports.

d-i ack needed for the udeb; please go ahead in the meantime.

Thanks


> diff --git a/debian/changelog b/debian/changelog
> index c5f3bdc6..c0768cdb 100644
> --- a/debian/changelog
> +++ b/debian/changelog
> @@ -1,3 +1,13 @@
> +glibc (2.41-12+deb13u4) trixie; urgency=medium
> +
> +  * debian/patches/git-updates.diff: update from upstream stable branch:
> +    - Fix build against linux 7.0 headers.  Closes: #1135405.
> +    - Fix ungetwc operating on byte stream (CVE-2026-5928).  Closes: 
> #1134544.
> +    - Fix buffer overflow in scanf %mc (CVE-2026-5450).  Closes: #1134543.
> +    - Suppress iconv intermediate errors with //TRANSLIT.
> +
> + -- Aurelien Jarno <[email protected]>  Mon, 29 Jun 2026 23:37:52 +0200
> +
>  glibc (2.41-12+deb13u3) trixie; urgency=medium
>  
>    * debian/control.in/libc: ensure that libdpkg-perl is fixed wrt symbol
> diff --git a/debian/patches/git-updates.diff b/debian/patches/git-updates.diff
> index 7141ec99..b9e8c02f 100644
> --- a/debian/patches/git-updates.diff
> +++ b/debian/patches/git-updates.diff
> @@ -3622,6 +3622,20 @@ index 0000000000..66a0db4f51
>  +}
>  +
>  +#include <support/test-driver.c>
> +diff --git a/iconv/Makefile b/iconv/Makefile
> +index 9a94a41ba4..028d24ffc3 100644
> +--- a/iconv/Makefile
> ++++ b/iconv/Makefile
> +@@ -138,7 +138,8 @@ $(objpfx)test-iconvconfig.out: $(objpfx)iconvconfig
> +      rm -f $$tmp) > $@; \
> +     $(evaluate-test)
> + 
> +-$(objpfx)tst-iconv_prog.out: tst-iconv_prog.sh $(objpfx)iconv_prog
> ++$(objpfx)tst-iconv_prog.out: tst-iconv_prog.sh $(objpfx)iconv_prog \
> ++  $(gen-locales)
> +     $(BASH) $< $(common-objdir) '$(test-wrapper-env)' \
> +              '$(run-program-env)' > $@; \
> +     $(evaluate-test)
>  diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
>  index 7dba5d8dff..558cfb11a3 100644
>  --- a/iconv/iconv_prog.c
> @@ -3644,6 +3658,23 @@ index 7dba5d8dff..558cfb11a3 100644
>         if (output_fd >= 0)
>       output_buffer_size = copy_buffer_size;
>         else
> +diff --git a/iconv/loop.c b/iconv/loop.c
> +index 1378d23147..74b2a3e26d 100644
> +--- a/iconv/loop.c
> ++++ b/iconv/loop.c
> +@@ -144,8 +144,10 @@
> +     if (irreversible == NULL)                                               
>       \
> +       {                                                                     
>       \
> +     /* This means we are in call from __gconv_transliterate.  In this     \
> +-       case we are not doing any error recovery ourselves.  */            \
> +-    result = __gconv_mark_illegal_input (step_data);                      \
> ++       case we are not doing any error recovery ourselves.  Do not create \
> ++       a persistent error state.  If __gconv_transliterate exhausts all   \
> ++       alternatives, it will call __gconv_mark_illegal_input itself.  */  \
> ++    result = __GCONV_ILLEGAL_INPUT;                                       \
> +     break;                                                                \
> +       }                                                                     
>       \
> +                                                                           \
>  diff --git a/iconv/tst-iconv_prog-buffer.sh b/iconv/tst-iconv_prog-buffer.sh
>  index 1c499d590d..40340c38fa 100644
>  --- a/iconv/tst-iconv_prog-buffer.sh
> @@ -3659,6 +3690,61 @@ index 1c499d590d..40340c38fa 100644
>       if ! cmp -s "$tmp/out" "$tmp/expected" ; then
>           echo "error: iconv output difference" >&$logfd
>           echo "*** expected ***" >&$logfd
> +diff --git a/iconv/tst-iconv_prog.sh b/iconv/tst-iconv_prog.sh
> +index e2a43280d2..7d7948b7aa 100644
> +--- a/iconv/tst-iconv_prog.sh
> ++++ b/iconv/tst-iconv_prog.sh
> +@@ -27,10 +27,10 @@ LIBPATH=$codir:$codir/iconvdata
> + 
> + # How the start the iconv(1) program.  $from is not defined/expanded yet.
> + ICONV='
> ++$test_wrapper_env $run_program_env
> + $codir/elf/ld.so --library-path $LIBPATH --inhibit-rpath ${from}.so
> + $codir/iconv/iconv_prog
> + '
> +-ICONV="$test_wrapper_env $run_program_env $ICONV"
> + 
> + TIMEOUTFACTOR=${TIMEOUTFACTOR:-1}
> + 
> +@@ -218,6 +218,7 @@ testarray=(
> + "\x00\x00;;INVALID;UTF-8;1"
> + "\x00\x00;;UTF-8;INVALID;1"
> + "\xc3\xa9;;UTF-8;ASCII//TRANSLIT;0"
> ++"X\xc2\xbdY;;UTF-8;ASCII//TRANSLIT;0"
> + )
> + 
> + # Requires $twobyte input, $c flag, $from, and $to to be set; sets $ret
> +@@ -278,12 +279,21 @@ check_errtest_result ()
> +   fi
> + }
> + 
> +-for testcommand in "${testarray[@]}"; do
> +-  twobyte="$(echo "$testcommand" | cut -d";" -f 1)"
> +-  c="$(echo "$testcommand" | cut -d";" -f 2)"
> +-  from="$(echo "$testcommand" | cut -d";" -f 3)"
> +-  to="$(echo "$testcommand" | cut -d";" -f 4)"
> +-  eret="$(echo "$testcommand" | cut -d";" -f 5)"
> +-  execute_test
> +-  check_errtest_result
> +-done
> ++run_test_array ()
> ++{
> ++  for testcommand in "${testarray[@]}"; do
> ++    twobyte="$(echo "$testcommand" | cut -d";" -f 1)"
> ++    c="$(echo "$testcommand" | cut -d";" -f 2)"
> ++    from="$(echo "$testcommand" | cut -d";" -f 3)"
> ++    to="$(echo "$testcommand" | cut -d";" -f 4)"
> ++    eret="$(echo "$testcommand" | cut -d";" -f 5)"
> ++    execute_test
> ++    check_errtest_result
> ++  done
> ++}
> ++
> ++echo "info: testing C locale"
> ++run_test_array
> ++echo "info: testing en_US.UTF-8 locale"
> ++run_program_env="$run_program_env LC_ALL=en_US.UTF-8"
> ++run_test_array
>  diff --git a/iconvdata/Makefile b/iconvdata/Makefile
>  index 5a2abeea24..cc689f63e9 100644
>  --- a/iconvdata/Makefile
> @@ -4076,6 +4162,108 @@ index f5cee6caef..ba967833ad 100644
>   
>   #define RPC_THREAD_VARIABLE(x) (__rpc_thread_variables()->x)
>   
> +diff --git a/io/fcntl.c b/io/fcntl.c
> +index e88e28664c..b7dab1bb39 100644
> +--- a/io/fcntl.c
> ++++ b/io/fcntl.c
> +@@ -18,6 +18,10 @@
> + #include <errno.h>
> + #include <fcntl.h>
> + 
> ++#ifndef __O_CLOEXEC
> ++# error __O_CLOEXEC not defined by fcntl.h/cloexec.h
> ++#endif
> ++
> + /* Perform file control operations on FD.  */
> + int
> + __fcntl (int fd, int cmd, ...)
> +diff --git a/libio/Makefile b/libio/Makefile
> +index e143ccdb2c..43ee8db06d 100644
> +--- a/libio/Makefile
> ++++ b/libio/Makefile
> +@@ -83,6 +83,7 @@ tests = \
> +   bug-ungetwc1 \
> +   bug-ungetwc2 \
> +   bug-wfflush \
> ++  bug-wgenops-bz33998 \
> +   bug-wmemstream1 \
> +   bug-wsetpos \
> +   test-fmemopen \
> +diff --git a/libio/bug-wgenops-bz33998.c b/libio/bug-wgenops-bz33998.c
> +new file mode 100644
> +index 0000000000..cc4067da99
> +--- /dev/null
> ++++ b/libio/bug-wgenops-bz33998.c
> +@@ -0,0 +1,54 @@
> ++/* Regression test for ungetwc operating on byte stream (BZ #33998)
> ++   Copyright (C) 2026 The GNU Toolchain Authors.
> ++   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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include "support/temp_file.h"
> ++#include "support/xstdio.h"
> ++#include "support/xunistd.h"
> ++#include <stdlib.h>
> ++#include <unistd.h>
> ++#include <sys/mman.h>
> ++#include <stdio.h>
> ++#include <wchar.h>
> ++#include <support/check.h>
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  char *filename;
> ++  int fd = create_temp_file ("tst-bz33998-", &filename);
> ++  TEST_VERIFY (fd != -1);
> ++  xwrite (fd, "A", sizeof ("A")); // write "A\0" by design
> ++  xclose (fd);
> ++
> ++  FILE *fp = xfopen (filename, "r+");
> ++  TEST_COMPARE (getwc (fp), L'A');
> ++  /* If the bug is fixed, then ungetwc should not touch byte stream.
> ++     If the bug is not fixed, ungetwc firstly match last read char, L'A',
> ++     failed, then the pbackfail branch, matching last read char in byte
> ++     stream, that is, '\0' (initialized when setup wide stream). */
> ++  char *old_read_ptr = fp->_IO_read_ptr;
> ++  TEST_COMPARE (ungetwc (L'\0', fp), L'\0');
> ++  TEST_VERIFY (fp->_IO_read_ptr == old_read_ptr);
> ++
> ++  xfclose (fp);
> ++  free (filename);
> ++
> ++  return 0;
> ++}
> ++
> ++#include <support/test-driver.c>
> +diff --git a/libio/wgenops.c b/libio/wgenops.c
> +index 0a11d1b1de..9e0b2c00ea 100644
> +--- a/libio/wgenops.c
> ++++ b/libio/wgenops.c
> +@@ -108,8 +108,8 @@ _IO_wdefault_pbackfail (FILE *fp, wint_t c)
> + {
> +   if (fp->_wide_data->_IO_read_ptr > fp->_wide_data->_IO_read_base
> +       && !_IO_in_backup (fp)
> +-      && (wint_t) fp->_IO_read_ptr[-1] == c)
> +-    --fp->_IO_read_ptr;
> ++      && (wint_t) fp->_wide_data->_IO_read_ptr[-1] == c)
> ++    --fp->_wide_data->_IO_read_ptr;
> +   else
> +     {
> +       /* Need to handle a filebuf in write mode (switch to read mode). 
> FIXME!*/
>  diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c
>  index 867f829be5..47be1c9a39 100644
>  --- a/locale/lc-ctype.c
> @@ -4166,6 +4354,19 @@ index 30c094d43a..5e25c0e4b8 100644
>   const struct __locale_struct _nl_C_locobj attribute_hidden =
>     {
>       .__locales =
> +diff --git a/localedata/Makefile b/localedata/Makefile
> +index 94014370f5..d5e9f76899 100644
> +--- a/localedata/Makefile
> ++++ b/localedata/Makefile
> +@@ -236,6 +236,8 @@ tests = \
> +   bug-iconv-trans \
> +   bug-setlocale1 \
> +   bug-usesetlocale \
> ++  tst-bz12701-lc \
> ++  tst-bz12701-lc2 \
> +   tst-c-utf8-consistency \
> +   tst-digits \
> +   tst-iconv-emojis-trans \
>  diff --git a/localedata/locales/bg_BG b/localedata/locales/bg_BG
>  index 159a6c3334..eda2a8d01b 100644
>  --- a/localedata/locales/bg_BG
> @@ -4181,6 +4382,283 @@ index 159a6c3334..eda2a8d01b 100644
>   mon_decimal_point         ","
>   mon_thousands_sep         " "
>   mon_grouping              3
> +diff --git a/localedata/tst-bz12701-lc.c b/localedata/tst-bz12701-lc.c
> +new file mode 100644
> +index 0000000000..23c2ab7d2a
> +--- /dev/null
> ++++ b/localedata/tst-bz12701-lc.c
> +@@ -0,0 +1,218 @@
> ++/* Verify scanf field width handling with the 'lc' conversion (BZ #12701).
> ++   Copyright (C) 2025-2026 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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include <locale.h>
> ++#include <stddef.h>
> ++#include <stdio.h>
> ++#include <string.h>
> ++#include <wchar.h>
> ++
> ++#include <libc-diag.h>
> ++#include <support/check.h>
> ++#include <support/next_to_fault.h>
> ++#include <support/xstdio.h>
> ++
> ++/* Compare character-wise the initial part of the wide character object
> ++   pointed to by WS corresponding to wide characters obtained by the
> ++   conversion of first N bytes of the multibyte character object pointed
> ++   to by S.  */
> ++
> ++static int
> ++tst_bz12701_lc_memcmp (const wchar_t *ds, const char *s, size_t n)
> ++{
> ++  size_t nc = mbsnrtowcs (NULL, &s, n, 0, NULL);
> ++
> ++  struct support_next_to_fault ntf;
> ++  ntf = support_next_to_fault_allocate (nc * sizeof (wchar_t));
> ++  wchar_t *ss = (wchar_t *) ntf.buffer;
> ++
> ++  mbsnrtowcs (ss, &s, n, nc, NULL);
> ++  int r = wmemcmp (ds, ss, nc);
> ++
> ++  support_next_to_fault_free (&ntf);
> ++
> ++  return r;
> ++}
> ++
> ++/* Verify various aspects of field width handling, including the data
> ++   obtained, the number of bytes consumed, and the stream position.  */
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  if (setlocale (LC_ALL, "pl_PL.UTF-8") == NULL)
> ++    FAIL_EXIT1 ("setlocale (LC_ALL, \"pl_PL.UTF-8\")");
> ++
> ++  /* Part of a tongue-twister in Polish, which says:
> ++     "On a rainy morning cuckoos and warblers, rather than starting
> ++     on earthworms, stuffed themselves fasted with the flesh of cress."  */
> ++  static const char s[126] = "Dżdżystym rankiem gżegżółki i piegże, "
> ++                         "zamiast wziąć się za dżdżownice, "
> ++                         "nażarły się na czczo miąższu rzeżuchy";
> ++
> ++  const char *sp = s;
> ++  size_t nc;
> ++  TEST_VERIFY_EXIT ((nc = mbsnrtowcs (NULL, &sp, sizeof (s), 0, NULL)) == 
> 108);
> ++
> ++  struct support_next_to_fault ntfo, ntfi;
> ++  ntfo = support_next_to_fault_allocate (nc * sizeof (wchar_t));
> ++  ntfi = support_next_to_fault_allocate (sizeof (s));
> ++  wchar_t *e = (wchar_t *) ntfo.buffer + nc;
> ++  char *b = ntfi.buffer;
> ++
> ++  wchar_t *c;
> ++  FILE *f;
> ++  int ic;
> ++  int n;
> ++  int i;
> ++
> ++  memcpy (ntfi.buffer, s, sizeof (s));
> ++
> ++  ic = i = 0;
> ++  f = xfmemopen (b, sizeof (s), "r");
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  /* Avoid: "warning: zero width in gnu_scanf format [-Werror=format=]".  */
> ++  DIAG_PUSH_NEEDS_COMMENT;
> ++  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat");
> ++  TEST_VERIFY_EXIT (fscanf (f, "%0lc%n", c, &n) == 1);
> ++  DIAG_POP_NEEDS_COMMENT;
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 1;
> ++  i += n;
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 2);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 1;
> ++  i += n;
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%1lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 1;
> ++  i += n;
> ++
> ++  c = e - 2;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 3);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 2;
> ++  i += n;
> ++
> ++  c = e - 4;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%4lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 4);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 4;
> ++  i += n;
> ++
> ++  c = e - 8;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%8lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 8);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 8;
> ++  i += n;
> ++
> ++  c = e - 16;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%16lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 20);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 16;
> ++  i += n;
> ++
> ++  c = e - 32;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%32lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 38);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 32;
> ++  i += n;
> ++
> ++  c = e - (nc - ic);
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_COMPARE (fscanf (f, "%64lc%n", c, &n), 1);
> ++  TEST_COMPARE (n , 49);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, sizeof (s) - i) == 0);
> ++
> ++  TEST_VERIFY_EXIT (ftell (f) == sizeof (s));
> ++  TEST_VERIFY_EXIT (feof (f) != 0);
> ++
> ++  xfclose (f);
> ++
> ++  ic = i = 0;
> ++  f = xfmemopen (b, 3, "r");
> ++
> ++  c = e - 2;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 3);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 2;
> ++  i += n;
> ++
> ++  c = e - (nc - ic);
> ++  TEST_VERIFY_EXIT (feof (f) == 0);
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2lc%n", c, &n) == EOF);
> ++  TEST_VERIFY_EXIT (n == 3);
> ++
> ++  TEST_VERIFY_EXIT (ftell (f) == 3);
> ++  TEST_VERIFY_EXIT (feof (f) != 0);
> ++
> ++  xfclose (f);
> ++
> ++  ic = i = 0;
> ++  f = xfmemopen (b, 3, "r");
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, n) == 0);
> ++  ic += 1;
> ++  i += n;
> ++
> ++  c = e - (nc - ic);
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2lc%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 2);
> ++  TEST_VERIFY_EXIT (tst_bz12701_lc_memcmp (c, s + i, 3 - i) == 0);
> ++
> ++  TEST_VERIFY_EXIT (ftell (f) == 3);
> ++  TEST_VERIFY_EXIT (feof (f) != 0);
> ++
> ++  xfclose (f);
> ++
> ++  support_next_to_fault_free (&ntfi);
> ++  support_next_to_fault_free (&ntfo);
> ++
> ++  return 0;
> ++}
> ++
> ++#include <support/test-driver.c>
> +diff --git a/localedata/tst-bz12701-lc2.c b/localedata/tst-bz12701-lc2.c
> +new file mode 100644
> +index 0000000000..b24e86df0b
> +--- /dev/null
> ++++ b/localedata/tst-bz12701-lc2.c
> +@@ -0,0 +1,47 @@
> ++/* Verify scanf memory handling with the 'c' conversion (BZ #12701).
> ++   Copyright (C) 2026 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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include <stdio.h>
> ++#include <malloc.h>
> ++#include <string.h>
> ++
> ++#include <libc-diag.h>
> ++#include <support/check.h>
> ++#include <support/next_to_fault.h>
> ++#include <support/xstdio.h>
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  wchar_t *c = NULL;
> ++  int i;
> ++
> ++  TEST_VERIFY (sscanf ("1234", "%30mlc", &c) == 1);
> ++
> ++  TEST_VERIFY (c != NULL);
> ++  TEST_COMPARE_BLOB (c, 5 * sizeof (wchar_t),
> ++                 L"1234\0", 5 * sizeof (wchar_t));
> ++  for (i = 5; i < 30; i ++)
> ++    TEST_VERIFY (c[i] == L'\0');
> ++
> ++  TEST_VERIFY (malloc_usable_size (c) >= 30 * sizeof(wchar_t));
> ++
> ++  return 0;
> ++}
> ++
> ++#include <support/test-driver.c>
>  diff --git a/malloc/malloc.c b/malloc/malloc.c
>  index 27dfd1eb90..9423aba987 100644
>  --- a/malloc/malloc.c
> @@ -5933,6 +6411,37 @@ index d9f69649d0..181be80835 100644
>     check_reverse (1,
>                    "name: 1.in-addr.arpa\n"
>                    "net: 0x00000001\n");
> +diff --git a/stdio-common/Makefile b/stdio-common/Makefile
> +index 840289afd9..72c18e5dc1 100644
> +--- a/stdio-common/Makefile
> ++++ b/stdio-common/Makefile
> +@@ -232,6 +232,8 @@ tests := \
> +   tllformat \
> +   tst-bz11319 \
> +   tst-bz11319-fortify2 \
> ++  tst-bz12701-c \
> ++  tst-bz12701-c2 \
> +   tst-cookie \
> +   tst-dprintf-length \
> +   tst-fdopen \
> +@@ -309,6 +311,7 @@ tests := \
> +   tst-vfprintf-user-type \
> +   tst-vfprintf-width-i18n \
> +   tst-vfprintf-width-prec-alloc \
> ++  tst-vfscanf-bz34008 \
> +   tst-wc-printf \
> +   tstdiomisc \
> +   tstgetln \
> +@@ -513,6 +516,9 @@ tst-printf-bz18872-ENV = 
> MALLOC_TRACE=$(objpfx)tst-printf-bz18872.mtrace \
> + tst-vfprintf-width-prec-ENV = \
> +   MALLOC_TRACE=$(objpfx)tst-vfprintf-width-prec.mtrace \
> +   LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so
> ++tst-vfscanf-bz34008-ENV = \
> ++  MALLOC_CHECK_=3 \
> ++  LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so
> + tst-printf-bz25691-ENV = \
> +   MALLOC_TRACE=$(objpfx)tst-printf-bz25691.mtrace \
> +   LD_PRELOAD=$(common-objpfx)/malloc/libc_malloc_debug.so
>  diff --git a/stdio-common/printf-parsemb.c b/stdio-common/printf-parsemb.c
>  index aad697abbc..a7ba52a9fa 100644
>  --- a/stdio-common/printf-parsemb.c
> @@ -5945,6 +6454,364 @@ index aad697abbc..a7ba52a9fa 100644
>   #include <limits.h>
>   #include <stdlib.h>
>   #include <string.h>
> +diff --git a/stdio-common/tst-bz12701-c.c b/stdio-common/tst-bz12701-c.c
> +new file mode 100644
> +index 0000000000..4f3616fbfd
> +--- /dev/null
> ++++ b/stdio-common/tst-bz12701-c.c
> +@@ -0,0 +1,169 @@
> ++/* Verify scanf field width handling with the 'c' conversion (BZ #12701).
> ++   Copyright (C) 2025-2026 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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include <stdio.h>
> ++#include <string.h>
> ++
> ++#include <libc-diag.h>
> ++#include <support/check.h>
> ++#include <support/next_to_fault.h>
> ++#include <support/xstdio.h>
> ++
> ++/* Verify various aspects of field width handling, including the data
> ++   obtained, the number of bytes consumed, and the stream position.  */
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  static const char s[43] = "The quick brown fox jumps over the lazy dog";
> ++  struct support_next_to_fault ntfo, ntfi;
> ++  ntfo = support_next_to_fault_allocate (sizeof (s));
> ++  ntfi = support_next_to_fault_allocate (sizeof (s));
> ++  char *e = ntfo.buffer + sizeof (s);
> ++  char *b = ntfi.buffer;
> ++
> ++  char *c;
> ++  FILE *f;
> ++  int n;
> ++  int i;
> ++
> ++  memcpy (ntfi.buffer, s, sizeof (s));
> ++
> ++  i = 0;
> ++  f = xfmemopen (b, sizeof (s), "r");
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  /* Avoid: "warning: zero width in gnu_scanf format [-Werror=format=]".  */
> ++  DIAG_PUSH_NEEDS_COMMENT;
> ++  DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat");
> ++  TEST_VERIFY_EXIT (fscanf (f, "%0c%n", c, &n) == 1);
> ++  DIAG_POP_NEEDS_COMMENT;
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%1c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 2;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 2);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 4;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%4c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 4);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 8;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%8c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 8);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 16;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%16c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 16);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - (sizeof (s) - i);
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%32c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 10);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, sizeof (s) - i) == 0);
> ++
> ++  TEST_VERIFY_EXIT (ftell (f) == sizeof (s));
> ++  TEST_VERIFY_EXIT (feof (f) != 0);
> ++
> ++  xfclose (f);
> ++
> ++  i = 0;
> ++  f = xfmemopen (b, 3, "r");
> ++
> ++  c = e - 1;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - 2;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 2);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - (3 - i);
> ++  TEST_VERIFY_EXIT (feof (f) == 0);
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2c%n", c, &n) == EOF);
> ++  TEST_VERIFY_EXIT (n == 2);
> ++
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (feof (f) != 0);
> ++
> ++  xfclose (f);
> ++
> ++  i = 0;
> ++  f = xfmemopen (b, 3, "r");
> ++
> ++  c = e - 2;
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 2);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, n) == 0);
> ++  i += n;
> ++
> ++  c = e - (3 - i);
> ++  TEST_VERIFY_EXIT (ftell (f) == i);
> ++  TEST_VERIFY_EXIT (fscanf (f, "%2c%n", c, &n) == 1);
> ++  TEST_VERIFY_EXIT (n == 1);
> ++  TEST_VERIFY_EXIT (memcmp (c, s + i, 3 - i) == 0);
> ++
> ++  TEST_VERIFY_EXIT (ftell (f) == 3);
> ++  TEST_VERIFY_EXIT (feof (f) != 0);
> ++
> ++  xfclose (f);
> ++
> ++  support_next_to_fault_free (&ntfi);
> ++  support_next_to_fault_free (&ntfo);
> ++
> ++  return 0;
> ++}
> ++
> ++#include <support/test-driver.c>
> +diff --git a/stdio-common/tst-bz12701-c2.c b/stdio-common/tst-bz12701-c2.c
> +new file mode 100644
> +index 0000000000..5f9ca7c592
> +--- /dev/null
> ++++ b/stdio-common/tst-bz12701-c2.c
> +@@ -0,0 +1,46 @@
> ++/* Verify scanf memory handling with the 'c' conversion (BZ #12701).
> ++   Copyright (C) 2026 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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include <stdio.h>
> ++#include <malloc.h>
> ++#include <string.h>
> ++
> ++#include <libc-diag.h>
> ++#include <support/check.h>
> ++#include <support/next_to_fault.h>
> ++#include <support/xstdio.h>
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  char *c = NULL;
> ++  int i;
> ++
> ++  TEST_VERIFY (sscanf ("1234", "%30mc", &c) == 1);
> ++
> ++  TEST_VERIFY (c != NULL);
> ++  TEST_COMPARE_BLOB (c, 5, "1234\0", 5);
> ++  for (i = 5; i < 30; i ++)
> ++    TEST_VERIFY (c[i] == '\0');
> ++
> ++  TEST_VERIFY (malloc_usable_size (c) >= 30);
> ++
> ++  return 0;
> ++}
> ++
> ++#include <support/test-driver.c>
> +diff --git a/stdio-common/tst-vfscanf-bz34008.c 
> b/stdio-common/tst-vfscanf-bz34008.c
> +new file mode 100644
> +index 0000000000..48371c8a3d
> +--- /dev/null
> ++++ b/stdio-common/tst-vfscanf-bz34008.c
> +@@ -0,0 +1,48 @@
> ++/* Regression test for vfscanf %Nmc out-of-bound write (BZ #34008)
> ++   Copyright (C) 2026 The GNU Toolchain Authors.
> ++   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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include "malloc/mcheck.h"
> ++#include <stddef.h>
> ++#include <stdio.h>
> ++#include <string.h>
> ++#include <wchar.h>
> ++#include <stdlib.h>
> ++#include <malloc.h>
> ++#include <support/check.h>
> ++
> ++#define WIDTH 0x410
> ++#define SCANFSTR "%1040mc"
> ++static int
> ++do_test (void)
> ++{
> ++  mcheck_pedantic (NULL);
> ++  char *input = malloc (WIDTH + 1);
> ++  TEST_VERIFY (input != NULL);
> ++  memset (input, 'A', WIDTH);
> ++  input[WIDTH] = '\0';
> ++
> ++  char *buf = NULL;
> ++  TEST_VERIFY (sscanf (input, SCANFSTR, &buf) != -1);
> ++  TEST_VERIFY (buf != NULL);
> ++
> ++  free (buf);
> ++  free (input);
> ++  return 0;
> ++}
> ++
> ++#include <support/test-driver.c>
> +diff --git a/stdio-common/vfscanf-internal.c 
> b/stdio-common/vfscanf-internal.c
> +index 87f23b5845..fabb0ec874 100644
> +--- a/stdio-common/vfscanf-internal.c
> ++++ b/stdio-common/vfscanf-internal.c
> +@@ -780,9 +780,9 @@ __vfscanf_internal (FILE *s, const char *format, va_list 
> argptr,
> +                 conv_error ();                                            \
> +             } while (0)
> + #ifdef COMPILE_WSCANF
> +-          STRING_ARG (str, char, 100);
> ++          STRING_ARG (str, char, (width > 0 ? width : 1));
> + #else
> +-          STRING_ARG (str, char, (width > 1024 ? 1024 : width));
> ++          STRING_ARG (str, char, (width > 0 ? width : 1));
> + #endif
> + 
> +           c = inchar ();
> +@@ -853,8 +853,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list 
> argptr,
> +                     {
> +                       /* Enlarge the buffer.  */
> +                       size_t newsize
> +-                        = strsize
> +-                          + (strsize >= width ? width - 1 : strsize);
> ++                        = strsize + (strsize >= width ? width : strsize);
> + 
> +                       str = (char *) realloc (*strptr, newsize);
> +                       if (str == NULL)
> +@@ -892,6 +891,11 @@ __vfscanf_internal (FILE *s, const char *format, 
> va_list argptr,
> + 
> +           if (!(flags & SUPPRESS))
> +             {
> ++              /* If the buffer isn't completely filled, pad it with NULs.  
> */
> ++              if (flags & MALLOC)
> ++                while (width-- > 0)
> ++                  *str++ = '\0';
> ++
> +               if ((flags & MALLOC) && str - *strptr != strsize)
> +                 {
> +                   char *cp = (char *) realloc (*strptr, str - *strptr);
> +@@ -909,7 +913,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list 
> argptr,
> +       if (width == -1)
> +         width = 1;
> + 
> +-      STRING_ARG (wstr, wchar_t, (width > 1024 ? 1024 : width));
> ++      STRING_ARG (wstr, wchar_t, (width > 0 ? width : 1));
> + 
> +       c = inchar ();
> +       if (__glibc_unlikely (c == EOF))
> +@@ -925,7 +929,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list 
> argptr,
> +                   && wstr == (wchar_t *) *strptr + strsize)
> +                 {
> +                   size_t newsize
> +-                    = strsize + (strsize > width ? width - 1 : strsize);
> ++                    = strsize + (strsize >= width ? width : strsize);
> +                   /* Enlarge the buffer.  */
> +                   wstr = (wchar_t *) realloc (*strptr,
> +                                               newsize * sizeof (wchar_t));
> +@@ -980,7 +984,7 @@ __vfscanf_internal (FILE *s, const char *format, va_list 
> argptr,
> +                 && wstr == (wchar_t *) *strptr + strsize)
> +               {
> +                 size_t newsize
> +-                  = strsize + (strsize > width ? width - 1 : strsize);
> ++                  = strsize + (strsize >= width ? width : strsize);
> +                 /* Enlarge the buffer.  */
> +                 wstr = (wchar_t *) realloc (*strptr,
> +                                             newsize * sizeof (wchar_t));
> +@@ -1045,6 +1049,11 @@ __vfscanf_internal (FILE *s, const char *format, 
> va_list argptr,
> + 
> +       if (!(flags & SUPPRESS))
> +         {
> ++          /* If the buffer isn't completely filled, pad it with NULs.  */
> ++          if (flags & MALLOC)
> ++            while (width-- > 0)
> ++              *wstr++ = L'\0';
> ++
> +           if ((flags & MALLOC) && wstr - (wchar_t *) *strptr != strsize)
> +             {
> +               wchar_t *cp = (wchar_t *) realloc (*strptr,
>  diff --git a/stdlib/Makefile b/stdlib/Makefile
>  index 1c4fa2382f..c9c8f702a2 100644
>  --- a/stdlib/Makefile
> @@ -6097,6 +6964,18 @@ index a04b7ec47f..e20f0a6230 100644
>   #include <shlib-compat.h>
>   #include <libc-symbols.h>
>   
> +diff --git a/support/Makefile b/support/Makefile
> +index 59a9974539..37741ab405 100644
> +--- a/support/Makefile
> ++++ b/support/Makefile
> +@@ -134,6 +134,7 @@ libsupport-routines = \
> +   xfclose \
> +   xfdopendir \
> +   xfgets \
> ++  xfmemopen \
> +   xfopen \
> +   xfork \
> +   xfread \
>  diff --git a/support/capture_subprocess.h b/support/capture_subprocess.h
>  index 91d75e5d6b..b37462d0d1 100644
>  --- a/support/capture_subprocess.h
> @@ -6370,6 +7249,55 @@ index 79d3189e2f..e35cd7316f 100644
>         if (cnt == 1 && val != files[i].bad_value)
>       continue;
>   
> +diff --git a/support/xfmemopen.c b/support/xfmemopen.c
> +new file mode 100644
> +index 0000000000..f1dbc72c67
> +--- /dev/null
> ++++ b/support/xfmemopen.c
> +@@ -0,0 +1,31 @@
> ++/* fmemopen with error checking.
> ++   Copyright (C) 2025 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
> ++   <https://www.gnu.org/licenses/>.  */
> ++
> ++#include <support/xstdio.h>
> ++
> ++#include <support/check.h>
> ++#include <stdlib.h>
> ++
> ++FILE *
> ++xfmemopen (void *mem, size_t len, const char *mode)
> ++{
> ++  FILE *fp = fmemopen (mem, len, mode);
> ++  if (fp == NULL)
> ++    FAIL_EXIT1 ("fmemopen (mode \"%s\"): %m", mode);
> ++  return fp;
> ++}
> +diff --git a/support/xstdio.h b/support/xstdio.h
> +index c3fdf9496f..70b83f11da 100644
> +--- a/support/xstdio.h
> ++++ b/support/xstdio.h
> +@@ -27,6 +27,7 @@ __BEGIN_DECLS
> + FILE *xfopen (const char *path, const char *mode);
> + void xfclose (FILE *);
> + FILE *xfreopen (const char *path, const char *mode, FILE *stream);
> ++FILE *xfmemopen (void *mem, size_t len, const char *mode);
> + void xfread (void *ptr, size_t size, size_t nmemb, FILE *stream);
> + char *xfgets (char *s, int size, FILE *stream);
> + 
>  diff --git a/sysdeps/aarch64/Makefile b/sysdeps/aarch64/Makefile
>  index 4b7f8a5c07..53f5bd4ce0 100644
>  --- a/sysdeps/aarch64/Makefile
> @@ -13985,6 +14913,18 @@ index c9c25c2e47..08e1e77210 100644
>     /* Let libc do the rest of the initialization, and call main.  */
>       call    __libc_start_main
>        nop
> +diff --git a/sysdeps/unix/sysv/linux/Makefile 
> b/sysdeps/unix/sysv/linux/Makefile
> +index 395d2d6593..77ef32ee43 100644
> +--- a/sysdeps/unix/sysv/linux/Makefile
> ++++ b/sysdeps/unix/sysv/linux/Makefile
> +@@ -129,6 +129,7 @@ CFLAGS-test-errno-linux.c += $(no-fortify-source)
> + 
> + sysdep_headers += \
> +   bits/a.out.h \
> ++  bits/cloexec.h \
> +   bits/epoll.h \
> +   bits/eventfd.h \
> +   bits/inotify.h \
>  diff --git a/sysdeps/unix/sysv/linux/aarch64/Makefile 
> b/sysdeps/unix/sysv/linux/aarch64/Makefile
>  index 1fdad67fae..0839f0b08c 100644
>  --- a/sysdeps/unix/sysv/linux/aarch64/Makefile
> @@ -14906,6 +15846,35 @@ index d5943a7485..2600bc9be3 100644
>       mov     x0, #0x4111     /* CLONE_VM | CLONE_VFORK | SIGCHLD */
>       mov     x1, sp
>       DO_CALL (clone, 2)
> +diff --git a/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h 
> b/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h
> +new file mode 100644
> +index 0000000000..f381f28a53
> +--- /dev/null
> ++++ b/sysdeps/unix/sysv/linux/alpha/bits/cloexec.h
> +@@ -0,0 +1 @@
> ++#define __O_CLOEXEC 010000000
> +diff --git a/sysdeps/unix/sysv/linux/bits/cloexec.h 
> b/sysdeps/unix/sysv/linux/bits/cloexec.h
> +new file mode 100644
> +index 0000000000..3059fb6473
> +--- /dev/null
> ++++ b/sysdeps/unix/sysv/linux/bits/cloexec.h
> +@@ -0,0 +1 @@
> ++#define __O_CLOEXEC 02000000
> +diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h 
> b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
> +index dfc554aafc..9f93ee0325 100644
> +--- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
> ++++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
> +@@ -81,9 +81,7 @@
> + #ifndef __O_NOFOLLOW
> + # define __O_NOFOLLOW       0400000
> + #endif
> +-#ifndef __O_CLOEXEC
> +-# define __O_CLOEXEC   02000000
> +-#endif
> ++#include <bits/cloexec.h>
> + #ifndef __O_DIRECT
> + # define __O_DIRECT  040000
> + #endif
>  diff --git a/sysdeps/unix/sysv/linux/bits/sched.h 
> b/sysdeps/unix/sysv/linux/bits/sched.h
>  index 3656e98eda..39b0b3d19c 100644
>  --- a/sysdeps/unix/sysv/linux/bits/sched.h
> @@ -15005,6 +15974,13 @@ index f03ecd4da9..0e66944570 100644
>         goto out;
>       }
>   
> +diff --git a/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h 
> b/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h
> +new file mode 100644
> +index 0000000000..f381f28a53
> +--- /dev/null
> ++++ b/sysdeps/unix/sysv/linux/hppa/bits/cloexec.h
> +@@ -0,0 +1 @@
> ++#define __O_CLOEXEC 010000000
>  diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h 
> b/sysdeps/unix/sysv/linux/rseq-internal.h
>  index f89e784243..d2ab4cb829 100644
>  --- a/sysdeps/unix/sysv/linux/rseq-internal.h
> @@ -15028,6 +16004,57 @@ index f89e784243..d2ab4cb829 100644
>   
>         int ret = INTERNAL_SYSCALL_CALL (rseq, RSEQ_SELF (), size, 0, 
> RSEQ_SIG);
>         if (!INTERNAL_SYSCALL_ERROR_P (ret))
> +diff --git a/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h 
> b/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h
> +new file mode 100644
> +index 0000000000..6706eaa7d5
> +--- /dev/null
> ++++ b/sysdeps/unix/sysv/linux/sparc/bits/cloexec.h
> +@@ -0,0 +1 @@
> ++#define __O_CLOEXEC 0x400000
> +diff --git a/sysdeps/unix/sysv/linux/sys/mount.h 
> b/sysdeps/unix/sysv/linux/sys/mount.h
> +index 7c6d0805d7..bd6a089709 100644
> +--- a/sysdeps/unix/sysv/linux/sys/mount.h
> ++++ b/sysdeps/unix/sysv/linux/sys/mount.h
> +@@ -21,7 +21,6 @@
> + #ifndef _SYS_MOUNT_H
> + #define _SYS_MOUNT_H        1
> + 
> +-#include <fcntl.h>
> + #include <features.h>
> + #include <stdint.h>
> + #include <stddef.h>
> +@@ -265,9 +264,16 @@ enum fsconfig_command
> + #define FSOPEN_CLOEXEC          0x00000001
> + 
> + /* open_tree flags.  */
> +-#define OPEN_TREE_CLONE    1         /* Clone the target tree and attach 
> the clone */
> +-#define OPEN_TREE_CLOEXEC  O_CLOEXEC /* Close the file on execve() */
> +-
> ++#ifndef OPEN_TREE_CLONE
> ++# define OPEN_TREE_CLONE    1 /* Clone the target tree and attach the clone 
> */
> ++#endif
> ++#ifndef O_CLOEXEC
> ++# include <bits/cloexec.h>
> ++# define O_CLOEXEC __O_CLOEXEC
> ++#endif
> ++#ifndef OPEN_TREE_CLOEXEC
> ++# define OPEN_TREE_CLOEXEC  O_CLOEXEC /* Close the file on execve() */
> ++#endif
> + 
> + __BEGIN_DECLS
> + 
> +diff --git a/sysdeps/unix/sysv/linux/tst-mount.c 
> b/sysdeps/unix/sysv/linux/tst-mount.c
> +index 40913c7082..78a2772b2f 100644
> +--- a/sysdeps/unix/sysv/linux/tst-mount.c
> ++++ b/sysdeps/unix/sysv/linux/tst-mount.c
> +@@ -20,6 +20,7 @@
> + #include <support/check.h>
> + #include <support/xunistd.h>
> + #include <support/namespace.h>
> ++#include <fcntl.h> /* For AT_ constants.  */
> + #include <sys/mount.h>
> + 
> + _Static_assert (sizeof (struct mount_attr) == MOUNT_ATTR_SIZE_VER0,
>  diff --git a/sysdeps/unix/sysv/linux/tst-rseq.c 
> b/sysdeps/unix/sysv/linux/tst-rseq.c
>  index 00181cfefb..e83ea2b939 100644
>  --- a/sysdeps/unix/sysv/linux/tst-rseq.c


-- 
Jonathan Wiltshire                                      [email protected]
Debian Developer                         http://people.debian.org/~jmw

4096R: 0xD3524C51 / 0A55 B7C5 1223 3942 86EC  74C3 5394 479D D352 4C51
ed25519/0x196418AAEB74C8A1: CA619D65A72A7BADFC96D280196418AAEB74C8A1


Reply via email to