From e56f6d3b52dbd1a5a421ab5042b2325e1bf7a421 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Mon, 18 Nov 2024 16:09:30 +0100 Subject: [PATCH] Add printf function family tests (RHEL-46725) Resolves: RHEL-46725 --- glibc-RHEL-46725-1.patch | 2531 +++++++++++++++++++++++++++++++++++++ glibc-RHEL-46725-10.patch | 428 +++++++ glibc-RHEL-46725-11.patch | 458 +++++++ glibc-RHEL-46725-12.patch | 458 +++++++ glibc-RHEL-46725-2.patch | 459 +++++++ glibc-RHEL-46725-3.patch | 452 +++++++ glibc-RHEL-46725-4.patch | 423 +++++++ glibc-RHEL-46725-5.patch | 454 +++++++ glibc-RHEL-46725-6.patch | 454 +++++++ glibc-RHEL-46725-7.patch | 428 +++++++ glibc-RHEL-46725-8.patch | 454 +++++++ glibc-RHEL-46725-9.patch | 456 +++++++ glibc.spec | 17 +- 13 files changed, 7471 insertions(+), 1 deletion(-) create mode 100644 glibc-RHEL-46725-1.patch create mode 100644 glibc-RHEL-46725-10.patch create mode 100644 glibc-RHEL-46725-11.patch create mode 100644 glibc-RHEL-46725-12.patch create mode 100644 glibc-RHEL-46725-2.patch create mode 100644 glibc-RHEL-46725-3.patch create mode 100644 glibc-RHEL-46725-4.patch create mode 100644 glibc-RHEL-46725-5.patch create mode 100644 glibc-RHEL-46725-6.patch create mode 100644 glibc-RHEL-46725-7.patch create mode 100644 glibc-RHEL-46725-8.patch create mode 100644 glibc-RHEL-46725-9.patch diff --git a/glibc-RHEL-46725-1.patch b/glibc-RHEL-46725-1.patch new file mode 100644 index 0000000..389e7d3 --- /dev/null +++ b/glibc-RHEL-46725-1.patch @@ -0,0 +1,2531 @@ +commit 7ec4d7e3d1c0c6da11dbad1292fd9d94124c57ca +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted printf output specifiers + + This is a collection of tests for formatted printf output specifiers + covering the d, i, o, u, x, and X integer conversions, the e, E, f, F, + g, and G floating-point conversions, the c character conversion, and the + s string conversion. Also the hh, h, l, and ll length modifiers are + covered with the integer conversions as is the L length modifier with + the floating-point conversions. + + The -, +, space, #, and 0 flags are iterated over, as permitted by the + conversion handled, in tuples of 1..5, including tuples with repetitions + of 2, and combined with field width and/or precision, again as permitted + by the conversion. The resulting format string is then used to produce + output from respective sets of input data corresponding to the specific + conversion under test. POSIX extensions beyond ISO C are not used. + + Output is produced in the form of records which include both the format + string (and width and/or precision where given in the form of separate + arguments) and the conversion result, and is verified with GNU AWK using + the format obtained from each such record against the reference value + also supplied, relying on the fact that GNU AWK has its own independent + implementation of format processing, striving to be ISO C compatible. + + In the course of implementation I have determined that in the non-bignum + mode GNU AWK uses system sprintf(3) for the floating-point conversions, + defeating the objective of doing the verification against an independent + implementation. Additionally the bignum mode (using MPFR) is required + to correctly output wider integer and floating-point data. Therefore + for the conversions affected the relevant shell scripts sanity-check AWK + and terminate with unsupported status if the bignum mode is unavailable + for floating-point data or where data is output incorrectly. + + The f and F floating-point conversions are build-time options for GNU + AWK, depending on the environment, so they are probed for before being + used. Similarly the a and A floating-point conversions, however they + are currently not used, see below. Also GNU AWK does not handle the b + or B integer conversions at all at the moment, as at 5.3.0. Support for + the a, A, b, and B conversions can however be easily added following the + approach taken for the f and F conversions. + + Output produced by gawk for the a and A floating-point conversions does + not match one produced by us: insufficient precision is used where one + hasn't been explicitly given, e.g. for the negated maximum finite IEEE + 754 64-bit value of -1.79769313486231570814527423731704357e+308 and "%a" + format we produce -0x1.fffffffffffffp+1023 vs gawk's -0x1.000000p+1024 + and a different exponent is chosen otherwise, such as with "%.a" where + we output -0x2p+1023 vs gawk's -0x1p+1024 for the same value, or "%.20a" + where -0x1.fffffffffffff0000000p+1023 is our output, but gawk produces + -0xf.ffffffffffff80000000p+1020 instead. Consequently I chose not to + include a and A conversions in testing at this time. + + And last but not least there are numerous corner cases that GNU AWK does + not handle correctly, which are worked around by explicit handling in + the AWK script. These are in particular: + + - extraneous leading 0 produced for the alternative form with the o + conversion, e.g. { printf "%#.2o", 1 } produces "001" rather than + "01", + + - unexpected 0 produced where no characters are expected for the input + of 0 and the alternative form with the precision of 0 and the integer + hexadecimal conversions, e.g. { printf "%#.x", 0 } produces "0" rather + than "", + + - missing + character in the non-bignum mode only for the input of 0 + with the + flag, precision of 0 and the signed integer conversions, + e.g. { printf "%+.i", 0 } produces "" rather than "+", + + - missing space character in the non-bignum mode only for the input of 0 + with the space flag, precision of 0 and the signed integer + conversions, e.g. { printf "% .i", 0 } produces "" rather than " ", + + - for released gawk versions of up to 4.2.1 missing - character for the + input of -NaN with the floating-point conversions, e.g. { printf "%e", + "-nan" }' produces "nan" rather than "-nan", + + - for released gawk versions from 5.0.0 onwards + character output for + the input of -NaN with the floating-point conversions, e.g. { printf + "%e", "-nan" }' produces "+nan" rather than "-nan", + + - for released gawk versions from 5.0.0 onwards + character output for + the input of Inf or NaN in the absence of the + or space flags with + the floating-point conversions, e.g. { printf "%e", "inf" }' produces + "+inf" rather than "inf", + + - for released gawk versions of up to 4.2.1 missing + character for the + input of Inf or NaN with the + flag and the floating-point + conversions, e.g. { printf "%+e", "inf" }' produces "inf" rather than + "+inf", + + - for released gawk versions of up to 4.2.1 missing space character for + the input of Inf or NaN with the space flag and the floating-point + conversions, e.g. { printf "% e", "nan" }' produces "nan" rather than + " nan", + + - for released gawk versions from 5.0.0 onwards + character output for + the input of Inf or NaN with the space flag and the floating-point + conversions, e.g. { printf "% e", "inf" }' produces "+inf" rather than + " inf", + + - for released gawk versions from 5.0.0 onwards the field width is + ignored for the input of Inf or NaN and the floating-point + conversions, e.g. { printf "%20e", "-inf" }' produces "-inf" rather + than " -inf", + + NB for released gawk versions of up to 4.2.1 floating-point conversion + issues apply to the bignum mode only, as in the non-bignum mode system + sprintf(3) is used. As from version 5.0.0 specialized handling has been + added for [-]Inf and [-]NaN inputs and the issues listed apply to both + modes. The '--posix' flag makes gawk versions from 5.0.0 onwards avoid + the issue with field width and the + character unconditionally output + for the input of Inf or NaN, however not the remaining issues and then + the 'gensub' function is not supported in the POSIX mode, so to go this + path I deemed not worth it. + + Each test completes within single seconds except for the long double + one. There the F/f formats produce a large number of digits, which + appears to be computationally intensive and CPU-bound. Standalone + execution time for 'tst-printf-format-p-ldouble --direct f' is in the + range of 00m36s for POWER9@2.166GHz and 09m52s for FU740@1.2GHz and + output redirected locally to /dev/null, and 10m11s for FU740 and output + redirected over 100Mbps network via SSH to /dev/null, so the throughput + of the network adds very little (~3.2% in this case) to the processing + time. This is with IEEE 754 quad. + + So I have scaled the timeout for 'tst-printf-format-skeleton-ldouble' + accordingly. Regardless, following recent practice the test has been + added to the standard rather than extended set. However, unlike most + of the remaining tests it has been split by the conversion specifier, + so as to allow better parallelization of this long-running test. As + a side effect this lets the test report the unsupported status for the + F/f conversions where applicable, so 'tst-printf-format-p-double' has + been split for consistency as well. + + Only printf itself is handled at the moment, but the infrastructure + provides for all the printf family functions to be verified, changes + for which to be supplied separately. The complication around having + some tests iterating over all the relevant conversion specifiers and + other verifying conversion specifiers individually combined with + iterating over printf family functions has hit a peculiarity in GNU + make where the use of multiple targets with a pattern rule is handled + differently from such use with an ordinary rule. Consequently it + seems impossible to bulk-define a pattern rule using '$(foreach ...)', + where each target would simply trigger the recipe according to the + pattern and matching dependencies individually (such a rule does work, + but implies all targets to be updated with a single recipe execution). + + Therefore as a compromise a single single-target pattern rule has been + defined that has listed all the conversion-specific scripts and all the + test executables as dependencies. Consequently tests will be rerun in + the absence of changes to their actual sources or scripts whenever an + unrelated file has changed that has been listed. Also all the formatted + printf output tests will always be built whenever any single one is to + be run. This only affects test development and not test runs in the + field, though it does change the order of execution of the individual + steps and also acts as a Makefile barrier in parallel runs. As the + execution time dominates the compilation time for these tests it is not + seen as a serious shortcoming. + + As pointed out by Florian Weimer the malloc tracing + facility can take a substantial amount of time in calling dladdr(3) to + determine the caller's location. This is not needed by the verification + made with these tests, so I chose to interpose the symbol with a stub + implementation that always fails in the shared skeleton. We have total + control over the test environment, so I think it is a safe and minimal + impact approach. If there's ever anything else added to the tests that + would actually rely on dladdr(3) returning usable results, only then we + can think of a different approach. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 09d3622823203f74..0a45dcb4f45c0a5d 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -22,6 +22,34 @@ subdir := stdio-common + + include ../Makeconfig + ++# List of markers for printf family function tests. ++xprintf-funcs := p ++ ++# List of data types and formats for individual per-conversion printf tests. ++fmt-convs := double ldouble ++fmts := E e F f G g ++ ++# List of data types grouping all conversions in single printf tests. ++nonfmt-convs := c char int llong long s short ++nonfmt-convs += uchar uint ullong ulong ushort ++ ++convs := $(sort $(fmt-convs) $(nonfmt-convs)) ++ ++xprintf-srcs := \ ++ $(foreach p,$(xprintf-funcs), \ ++ $(foreach c,$(convs),tst-printf-format-$(p)-$(c))) ++ ++fmt-xprintf-stems := \ ++ $(foreach f,$(fmts), \ ++ $(foreach p,$(xprintf-funcs), \ ++ $(foreach c,$(fmt-convs), \ ++ tst-printf-format-$(p)-$(c)-$(f)))) ++nonfmt-xprintf-stems := \ ++ $(foreach p,$(xprintf-funcs), \ ++ $(foreach c,$(nonfmt-convs),tst-printf-format-$(p)-$(c))) ++ ++xprintf-stems := $(sort $(fmt-xprintf-stems) $(nonfmt-xprintf-stems)) ++ + headers := \ + bits/printf-ldbl.h \ + bits/stdio_lim.h \ +@@ -240,6 +268,7 @@ endif + endif + + test-srcs = \ ++ $(xprintf-srcs) \ + tst-printf \ + tst-printfsz-islongdouble \ + tst-unbputc \ +@@ -247,6 +276,7 @@ test-srcs = \ + + ifeq ($(run-built-tests),yes) + tests-special += \ ++ $(foreach f,$(xprintf-stems),$(objpfx)$(f).out) \ + $(objpfx)tst-printf.out \ + $(objpfx)tst-printfsz-islongdouble.out \ + $(objpfx)tst-setvbuf1-cmp.out \ +@@ -257,6 +287,7 @@ tests-special += \ + ifeq (yes,$(build-shared)) + ifneq ($(PERL),no) + tests-special += \ ++ $(foreach f,$(xprintf-stems),$(objpfx)$(f)-mem.out) \ + $(objpfx)tst-freopen2-mem.out \ + $(objpfx)tst-freopen3-mem.out \ + $(objpfx)tst-freopen4-mem.out \ +@@ -276,6 +307,8 @@ tests-special += \ + # tests-special + + generated += \ ++ $(foreach f,$(xprintf-stems),$(f)-mem.out) \ ++ $(foreach f,$(xprintf-stems),$(f).mtrace) \ + tst-freopen2-mem.out \ + tst-freopen2.mtrace \ + tst-freopen3-mem.out \ +@@ -402,6 +435,21 @@ $(objpfx)tst-printf.out: tst-printf.sh $(objpfx)tst-printf + $(SHELL) $< $(common-objpfx) '$(test-program-prefix)'; \ + $(evaluate-test) + ++# We can't split a quoted recipe line, so do it via an auxiliary variable. ++make-tst-printf-format-out = \ ++ AWK='$(AWK)' BASH='$(BASH)' \ ++ $(BASH) $< $@ $(common-objpfx) \ ++ '$(run-program-prefix-before-env) \ ++ $(run-program-env) \ ++ MALLOC_TRACE=$(@:.out=.mtrace) \ ++ LD_PRELOAD=$(common-objpfx)malloc/libc_malloc_debug.so \ ++ $(run-program-prefix-after-env)' ++$(objpfx)tst-printf-format-%.out: \ ++ tst-printf-format.sh $(foreach c,$(convs),tst-printf-format-$(c).sh) \ ++ $(foreach f,$(xprintf-srcs),$(objpfx)$(f)) tst-printf-format.awk ++ $(make-tst-printf-format-out) > $@; \ ++ $(evaluate-test) ++ + $(objpfx)tst-printfsz-islongdouble.out: \ + tst-printfsz-islongdouble.sh $(objpfx)tst-printfsz-islongdouble + $(SHELL) $^ '$(test-program-prefix)' $@; \ +@@ -415,6 +463,10 @@ $(objpfx)tst-printf-bz18872.c: tst-printf-bz18872.sh + $(objpfx)tst-%-mem.out: $(objpfx)tst-%.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-$*.mtrace > $@; \ + $(evaluate-test) ++$(objpfx)tst-printf-format-%-mem.out: $(objpfx)tst-printf-format-%.out ++ $(common-objpfx)malloc/mtrace \ ++ $(objpfx)tst-printf-format-$*.mtrace > $@; \ ++ $(evaluate-test) + + errlist-h = $(firstword $(wildcard $(addsuffix /errlist.h,$(sysdirs) .))) + +diff --git a/stdio-common/tst-printf-format-c.sh b/stdio-common/tst-printf-format-c.sh +new file mode 100644 +index 0000000000000000..2b8d72050f670fd6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-c.sh +@@ -0,0 +1,34 @@ ++#!/bin/bash ++# Testing of the 'c' printf conversion. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++echo Verifying c ++(set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-c c | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion c output error, first line:\n/") 2>&1 || ++ exit 1 +diff --git a/stdio-common/tst-printf-format-char.sh b/stdio-common/tst-printf-format-char.sh +new file mode 100644 +index 0000000000000000..99219679df2ddfb7 +--- /dev/null ++++ b/stdio-common/tst-printf-format-char.sh +@@ -0,0 +1,40 @@ ++#!/bin/bash ++# Testing of signed char printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=0 ++ ++for f in d i; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-char $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-double.sh b/stdio-common/tst-printf-format-double.sh +new file mode 100644 +index 0000000000000000..b4e61acfdc615c22 +--- /dev/null ++++ b/stdio-common/tst-printf-format-double.sh +@@ -0,0 +1,74 @@ ++#!/bin/bash ++# Testing of double printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++format=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++# For floating-point formats we need to use the bignum mode even if the ++# regular mode would do, because GAWK in the latter mode uses sprintf(3) ++# internally to process the conversion requested, so any bug in our code ++# would then be verified against itself, defeating the objective of doing ++# the verification against an independent implementation. ++AWK="${AWK:-awk} -M" ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="-1.79769313486231570814527423731704357e+308" ++val=$(echo "$ref" | $AWK '{ printf "%.35e\n", $1 }' 2>&1) && ++ test "$val" = "$ref" && status=0 ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++# Check for any additional conversions that AWK handles conditionally ++# according to its version and/or the environment it has been built in. ++# The 'A' and 'a' conversions are not suitable to use at this point, as ++# output produced by AWK is different apparently due to a subtlety in ++# rounding, so do not try them. ++declare -A conversion_disabled ++ref="-inf" ++for f in f F; do ++ conversion_disabled[$f]=true ++ val=$(echo "$ref" | $AWK '{ printf "%'$f'\n", $1 }' 2>&1) && ++ test "${val^^}" = "${ref^^}" && unset conversion_disabled[$f] ++done ++ ++if test "${conversion_disabled[$format]+set}" = set; then ++ echo Unsupported $format ++ status=77 ++else ++ echo Verifying $format ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-double $format | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | ++ sed "s/^/Conversion $format output error, first line:\n/") 2>&1 || ++ status=1 ++fi ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-int.sh b/stdio-common/tst-printf-format-int.sh +new file mode 100644 +index 0000000000000000..32dcfb160a3ab5e9 +--- /dev/null ++++ b/stdio-common/tst-printf-format-int.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash ++# Testing of int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="-2147483648" ++for AWK in "$AWK -M" "$AWK"; do ++ val=$(echo "$ref" | $AWK '{ printf "%d\n", $1 }' 2>&1) || continue ++ test "$val" = "$ref" && status=0 && break ++done ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++for f in d i; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-int $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-ldouble.sh b/stdio-common/tst-printf-format-ldouble.sh +new file mode 100644 +index 0000000000000000..4bfecadea9d7fe80 +--- /dev/null ++++ b/stdio-common/tst-printf-format-ldouble.sh +@@ -0,0 +1,74 @@ ++#!/bin/bash ++# Testing of long double printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++format=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++# For floating-point formats we need to use the bignum mode even if the ++# regular mode would do, because GAWK in the latter mode uses sprintf(3) ++# internally to process the conversion requested, so any bug in our code ++# would then be verified against itself, defeating the objective of doing ++# the verification against an independent implementation. ++AWK="${AWK:-awk} -M" ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="-1.18973149535723176508575932662800702e+4932" ++val=$(echo "$ref" | $AWK '{ PREC=113; printf "%.35e\n", $1 }' 2>&1) && ++ test "$val" = "$ref" && status=0 ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++# Check for any additional conversions that AWK handles conditionally ++# according to its version and/or the environment it has been built in. ++# The 'A' and 'a' conversions are not suitable to use at this point, as ++# output produced by AWK is different apparently due to a subtlety in ++# rounding, so do not try them. ++declare -A conversion_disabled ++ref="-inf" ++for f in f F; do ++ conversion_disabled[$f]=true ++ val=$(echo "$ref" | $AWK '{ printf "%'$f'\n", $1 }' 2>&1) && ++ test "${val^^}" = "${ref^^}" && unset conversion_disabled[$f] ++done ++ ++if test "${conversion_disabled[$format]+set}" = set; then ++ echo Unsupported $format ++ status=77 ++else ++ echo Verifying $format ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-ldouble $format | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | ++ sed "s/^/Conversion $format output error, first line:\n/") 2>&1 || ++ status=1 ++fi ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-llong.sh b/stdio-common/tst-printf-format-llong.sh +new file mode 100644 +index 0000000000000000..b028a2c89b30a9b6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-llong.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash ++# Testing of long long int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="9223372036854775807" ++for AWK in "$AWK -M" "$AWK"; do ++ val=$(echo "$ref" | $AWK '{ printf "%d\n", $1 }' 2>&1) || continue ++ test "$val" = "$ref" && status=0 && break ++done ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++for f in d i; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-llong $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-long.sh b/stdio-common/tst-printf-format-long.sh +new file mode 100644 +index 0000000000000000..77c67ea5bff12c05 +--- /dev/null ++++ b/stdio-common/tst-printf-format-long.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash ++# Testing of long int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="9223372036854775807" ++for AWK in "$AWK -M" "$AWK"; do ++ val=$(echo "$ref" | $AWK '{ printf "%d\n", $1 }' 2>&1) || continue ++ test "$val" = "$ref" && status=0 && break ++done ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++for f in d i; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-long $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-p-c.c b/stdio-common/tst-printf-format-p-c.c +new file mode 100644 +index 0000000000000000..ba46f55431aa59c1 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-p-char.c b/stdio-common/tst-printf-format-p-char.c +new file mode 100644 +index 0000000000000000..7640bf8f662e3515 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-p-double.c b/stdio-common/tst-printf-format-p-double.c +new file mode 100644 +index 0000000000000000..8271ec7beaa9e57d +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-p-int.c b/stdio-common/tst-printf-format-p-int.c +new file mode 100644 +index 0000000000000000..cdfaaacc34772cc9 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-p-ldouble.c b/stdio-common/tst-printf-format-p-ldouble.c +new file mode 100644 +index 0000000000000000..266989db32a848bb +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-p-llong.c b/stdio-common/tst-printf-format-p-llong.c +new file mode 100644 +index 0000000000000000..936f626a45e76211 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-p-long.c b/stdio-common/tst-printf-format-p-long.c +new file mode 100644 +index 0000000000000000..c82c3cac0957a1a3 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-p-s.c b/stdio-common/tst-printf-format-p-s.c +new file mode 100644 +index 0000000000000000..4b0201ae9465a6a8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-p-short.c b/stdio-common/tst-printf-format-p-short.c +new file mode 100644 +index 0000000000000000..2bf17f1b2522f5ed +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-p-uchar.c b/stdio-common/tst-printf-format-p-uchar.c +new file mode 100644 +index 0000000000000000..02a70c3f1546c422 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-p-uint.c b/stdio-common/tst-printf-format-p-uint.c +new file mode 100644 +index 0000000000000000..e61455e01013aba0 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-p-ullong.c b/stdio-common/tst-printf-format-p-ullong.c +new file mode 100644 +index 0000000000000000..16b2541acd66299f +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-p-ulong.c b/stdio-common/tst-printf-format-p-ulong.c +new file mode 100644 +index 0000000000000000..0b3a7fd2568f763b +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-p-ushort.c b/stdio-common/tst-printf-format-p-ushort.c +new file mode 100644 +index 0000000000000000..fa62f500ab00cbb3 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'printf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-p.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-p.h b/stdio-common/tst-printf-format-p.h +new file mode 100644 +index 0000000000000000..a9ffbb0d0e76a485 +--- /dev/null ++++ b/stdio-common/tst-printf-format-p.h +@@ -0,0 +1,29 @@ ++/* Test feature wrapper for formatted 'printf' output. ++ Copyright (C) 2024 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 ++ ++#define printf_under_test(...) \ ++({ \ ++ int result; \ ++ \ ++ result = printf (__VA_ARGS__); \ ++ if (result < 0) \ ++ perror ("printf"); \ ++ result; \ ++}) +diff --git a/stdio-common/tst-printf-format-s.sh b/stdio-common/tst-printf-format-s.sh +new file mode 100644 +index 0000000000000000..fa0690f9800a60ce +--- /dev/null ++++ b/stdio-common/tst-printf-format-s.sh +@@ -0,0 +1,34 @@ ++#!/bin/bash ++# Testing of the 's' printf conversion. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++echo Verifying s ++(set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-s s | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion s output error, first line:\n/") 2>&1 || ++ exit 1 +diff --git a/stdio-common/tst-printf-format-short.sh b/stdio-common/tst-printf-format-short.sh +new file mode 100644 +index 0000000000000000..a610a15fa1f6e96a +--- /dev/null ++++ b/stdio-common/tst-printf-format-short.sh +@@ -0,0 +1,40 @@ ++#!/bin/bash ++# Testing of short int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=0 ++ ++for f in d i; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-short $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-skeleton-c.c b/stdio-common/tst-printf-format-skeleton-c.c +new file mode 100644 +index 0000000000000000..3f9bbc91e3a58e59 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-c.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for the 'c' conversion. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 3 ++#define HUGE_WIDTH 4 ++#define REF_FMT "c" ++#define REF_VAL(v) (v) ++typedef unsigned char type_t; ++static const type_t vals[] = { 0, 42, UCHAR_MAX }; ++static const char length[] = ""; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-char.c b/stdio-common/tst-printf-format-skeleton-char.c +new file mode 100644 +index 0000000000000000..8c7b44b061f69cb6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-char.c +@@ -0,0 +1,31 @@ ++/* Test skeleton for formatted printf output for signed char conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 3 ++#define HUGE_WIDTH 5 ++#define REF_FMT "i" ++#define REF_VAL(v) ((((v) & 0xff) ^ 0x80) - 0x80) ++typedef int type_t; ++static const type_t vals[] = ++ { SCHAR_MIN - 123, SCHAR_MIN - 1, SCHAR_MIN, -123, -1, 0, 1, 42, SCHAR_MAX, ++ SCHAR_MAX + 1, SCHAR_MAX + 42 }; ++static const char length[] = "hh"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-double.c b/stdio-common/tst-printf-format-skeleton-double.c +new file mode 100644 +index 0000000000000000..03ac594736fd352f +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-double.c +@@ -0,0 +1,33 @@ ++/* Test skeleton for formatted printf output for double conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 20 ++#define HUGE_WIDTH 320 ++#define REF_FMT ".35e" ++#define REF_VAL(v) (v) ++#define PREC DBL_MANT_DIG ++typedef double type_t; ++static const type_t vals[] = ++ { -HUGE_VAL, -DBL_MAX, -DBL_MIN, copysign (0, -1), -NAN, NAN, 0, DBL_MIN, ++ DBL_MAX, HUGE_VAL }; ++static const char length[] = ""; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-int.c b/stdio-common/tst-printf-format-skeleton-int.c +new file mode 100644 +index 0000000000000000..5d2076c53f6bbc2d +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-int.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for int conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 8 ++#define HUGE_WIDTH 15 ++#define REF_FMT "i" ++#define REF_VAL(v) (v) ++typedef int type_t; ++static const type_t vals[] = { INT_MIN, -123, -1, 0, 1, 42, INT_MAX }; ++static const char length[] = ""; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-ldouble.c b/stdio-common/tst-printf-format-skeleton-ldouble.c +new file mode 100644 +index 0000000000000000..ed47e7796390ecaf +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-ldouble.c +@@ -0,0 +1,38 @@ ++/* Test skeleton for formatted printf output for long double conversions. ++ Copyright (C) 2024 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 ++#include ++ ++#define MID_WIDTH 20 ++#define HUGE_WIDTH 4950 ++#define REF_FMT ".35Le" ++#define REF_VAL(v) (v) ++#define PREC LDBL_MANT_DIG ++typedef long double type_t; ++static const type_t vals[] = ++ { -HUGE_VAL, -LDBL_MAX, -LDBL_MIN, copysign (0, -1), -NAN, NAN, 0, LDBL_MIN, ++ LDBL_MAX, HUGE_VAL }; ++static const char length[] = "L"; ++ ++#ifndef TIMEOUT ++# define TIMEOUT (DEFAULT_TIMEOUT * 64) ++#endif ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-llong.c b/stdio-common/tst-printf-format-skeleton-llong.c +new file mode 100644 +index 0000000000000000..9a4b7a39af660ba3 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-llong.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for long long int conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 15 ++#define HUGE_WIDTH 25 ++#define REF_FMT "lli" ++#define REF_VAL(v) (v) ++typedef long long int type_t; ++static const type_t vals[] = { LLONG_MIN, -123, -1, 0, 1, 42, LLONG_MAX }; ++static const char length[] = "ll"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-long.c b/stdio-common/tst-printf-format-skeleton-long.c +new file mode 100644 +index 0000000000000000..bf011b7fdb375fc6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-long.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for long int conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 15 ++#define HUGE_WIDTH 25 ++#define REF_FMT "li" ++#define REF_VAL(v) (v) ++typedef long int type_t; ++static const type_t vals[] = { LONG_MIN, -123, -1, 0, 1, 42, LONG_MAX }; ++static const char length[] = "l"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-s.c b/stdio-common/tst-printf-format-skeleton-s.c +new file mode 100644 +index 0000000000000000..59aab9fc89836ec6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-s.c +@@ -0,0 +1,30 @@ ++/* Test skeleton for formatted printf output for the 's' conversion. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 5 ++#define HUGE_WIDTH 10 ++#define REF_FMT "s" ++#define REF_VAL(v) (v) ++typedef const char *type_t; ++static const type_t vals[] = ++ { "", "The", "quick", "brown fox", "jumps over the lazy dog" }; ++static const char length[] = ""; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-short.c b/stdio-common/tst-printf-format-skeleton-short.c +new file mode 100644 +index 0000000000000000..1b7c8c09d71df95a +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-short.c +@@ -0,0 +1,31 @@ ++/* Test skeleton for formatted printf output for short int conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 4 ++#define HUGE_WIDTH 7 ++#define REF_FMT "i" ++#define REF_VAL(v) ((((v) & 0xffff) ^ 0x8000) - 0x8000) ++typedef int type_t; ++static const type_t vals[] = ++ { SHRT_MIN - 123, SHRT_MIN - 1, SHRT_MIN, -123, -1, 0, 1, 42, SHRT_MAX, ++ SHRT_MAX + 1, SHRT_MAX + 42 }; ++static const char length[] = "h"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-uchar.c b/stdio-common/tst-printf-format-skeleton-uchar.c +new file mode 100644 +index 0000000000000000..389188d746ffc508 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-uchar.c +@@ -0,0 +1,30 @@ ++/* Test skeleton for formatted printf output for unsigned char conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 3 ++#define HUGE_WIDTH 4 ++#define REF_FMT "u" ++#define REF_VAL(v) ((v) & 0xff) ++typedef unsigned int type_t; ++static const type_t vals[] = ++ { 0, 1, 42, UCHAR_MAX, UCHAR_MAX + 1, UCHAR_MAX + 42 }; ++static const char length[] = "hh"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-uint.c b/stdio-common/tst-printf-format-skeleton-uint.c +new file mode 100644 +index 0000000000000000..6a4159111402c467 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-uint.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for unsigned int conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 7 ++#define HUGE_WIDTH 14 ++#define REF_FMT "u" ++#define REF_VAL(v) (v) ++typedef unsigned int type_t; ++static const type_t vals[] = { 0, 1, 42, UINT_MAX }; ++static const char length[] = ""; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-ullong.c b/stdio-common/tst-printf-format-skeleton-ullong.c +new file mode 100644 +index 0000000000000000..a2ad7893cfec8b11 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-ullong.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for unsigned long long int convs. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 14 ++#define HUGE_WIDTH 24 ++#define REF_FMT "llu" ++#define REF_VAL(v) (v) ++typedef unsigned long long int type_t; ++static const type_t vals[] = { 0, 1, 42, UINT_MAX, ULLONG_MAX }; ++static const char length[] = "ll"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-ulong.c b/stdio-common/tst-printf-format-skeleton-ulong.c +new file mode 100644 +index 0000000000000000..05cd4e0efcc657e1 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-ulong.c +@@ -0,0 +1,29 @@ ++/* Test skeleton for formatted printf output for unsigned long int conversions. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 14 ++#define HUGE_WIDTH 24 ++#define REF_FMT "lu" ++#define REF_VAL(v) (v) ++typedef unsigned long int type_t; ++static const type_t vals[] = { 0, 1, 42, ULONG_MAX }; ++static const char length[] = "l"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton-ushort.c b/stdio-common/tst-printf-format-skeleton-ushort.c +new file mode 100644 +index 0000000000000000..5cc2e0283a54fa04 +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton-ushort.c +@@ -0,0 +1,30 @@ ++/* Test skeleton for formatted printf output for unsigned short int convs. ++ Copyright (C) 2024 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 ++ ++#define MID_WIDTH 3 ++#define HUGE_WIDTH 6 ++#define REF_FMT "u" ++#define REF_VAL(v) ((v) & 0xffff) ++typedef unsigned int type_t; ++static const type_t vals[] = ++ { 0, 1, 42, USHRT_MAX, USHRT_MAX + 1, USHRT_MAX + 42 }; ++static const char length[] = "h"; ++ ++#include "tst-printf-format-skeleton.c" +diff --git a/stdio-common/tst-printf-format-skeleton.c b/stdio-common/tst-printf-format-skeleton.c +new file mode 100644 +index 0000000000000000..e564d3a85395507e +--- /dev/null ++++ b/stdio-common/tst-printf-format-skeleton.c +@@ -0,0 +1,380 @@ ++/* Test skeleton for formatted printf output. ++ Copyright (C) 2024 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 ++ . */ ++ ++/* The following definitions have to be supplied by the source including ++ this skeleton: ++ ++ Macros: ++ MID_WIDTH Medium width/precision positive integer constant. Choose ++ such as to cause some, but not all the strings produced ++ to be truncated for the conversions handled. ++ HUGE_WIDTH Large width/precision positive integer constant. Choose ++ such as to cause none of the strings produced to be ++ truncated for the conversions handled. ++ REF_FMT Reference output format string. Use no flags and such ++ a precision and length modifier, where applicable, and ++ a conversion as to make sure the output produced allows ++ the original value to be reproduced. ++ REF_VAL(v) Reference value V transformation. For conversions with ++ a truncating length modifier define such as to reproduce ++ the truncation operation, otherwise let V pass through. ++ PREC [optional] Working precision positive integer constant. ++ Set to the number of binary digits in the significand for ++ the argument type handled; usually for floating-point ++ conversions only, but it may be required for 128-bit or ++ wider integer data types as well. ++ ++ Typedefs: ++ type_t Variadic function argument type. Define to the promoted ++ type corresponding to the conversion argument type ++ handled. ++ ++ Variables: ++ vals Array of TYPE_T values. Choose such as to cover boundary ++ and any special cases. ++ length Length modifier string. Define according to the ++ conversion argument type handled. ++ ++ The feature to be tested is wrapped into 'printf_under_test'. It is up ++ to the source including this skeleton if this is going to be a macro ++ or an actual function. ++ ++ See tst-*printf-format-*.c for usage examples. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* Set to nonzero to select all possible tuples with repetitions of 1..n ++ elements from the set of flags as defined in FLAGS array below; n is ++ the length of FLAGS array. Otherwise select all possible tuples with ++ repetitions of 1..2 elements, followed by tuples of 3..n elements where ++ the index of each element k; k = 2..n in FLAGS is lower than the index ++ of element k-1 in FLAGS. */ ++#ifndef TST_PRINTF_DUPS ++# define TST_PRINTF_DUPS 0 ++#endif ++/* Set to nonzero to report the precision (number of significand digits) ++ required for floating-point calculations. */ ++#ifndef PREC ++# define PREC 0 ++#endif ++ ++/* The list of conversions permitted for the '#' flag, the '0' flag, ++ and precision respectively. */ ++#define HASH_FORMATS "boxXaAeEfFgG" ++#define ZERO_FORMATS "bdiouxXaAeEfFgG" ++#define PREC_FORMATS "bdiouxXaAeEfFgGs" ++ ++/* Output format conversion flags. */ ++static struct ++{ ++ /* Flag character. */ ++ char f; ++ /* List of conversion specifiers the flag is valid for; NULL if all. */ ++ const char *s; ++} const flags[] = ++ { {'-'}, {'+'}, {' '}, {'#', HASH_FORMATS}, {'0', ZERO_FORMATS} }; ++ ++/* Helper to initialize elements of the PW array for the width and ++ precision to be specified as a positive integer directly in the ++ format, and then as both a negative and a positive argument to '*'. */ ++#define STR(v) #v ++#define WPINIT(v) {0, STR (v)}, {v, NULL}, {-v, NULL} ++ ++/* Width and precision settings to iterate over; zero is initialized ++ directly as it has no corresponding negated value and other values ++ use the helper above. */ ++static struct wp ++{ ++ /* Integer argument to '*', used if S is NULL. */ ++ int i; ++ /* String denoting an integer to use in the format, or NULL to use '*'. */ ++ const char *s; ++} const wp[] = ++ { {0, "0"}, {0, NULL}, WPINIT (1), WPINIT (2), ++ WPINIT (MID_WIDTH), WPINIT (HUGE_WIDTH) }; ++ ++/* Produce a record according to '%' and zero or more output format flags ++ already provided in FMT at indices 0..IDX-1, width W if non-NULL, '.' ++ precision specifier if POINT set to true, precision P if non-NULL, ++ any length modifiers L, conversion C, and value VAL. ++ ++ Record formats produced: ++ ++ %:: ++ %.:: ++ %:: ++ %.:: ++ %.

:: ++ %.

:: ++ %*::: ++ %*.::: ++ %.*:

:: ++ %*.*::

:: ++ ++ Return 0 on success, -1 on failure. */ ++ ++static int ++do_printf (char *fmt, size_t idx, ++ const struct wp *w, bool point, const struct wp *p, ++ const char *l, char c, type_t val) ++{ ++ int wpval[2] = { 0 }; ++ size_t nint = 0; ++ int result; ++ size_t i; ++ ++ if (w != NULL) ++ { ++ if (w->s == NULL) ++ { ++ fmt[idx++] = '*'; ++ wpval[nint++] = w->i; ++ } ++ else ++ for (i = 0; w->s[i] != '\0'; i++) ++ fmt[idx++] = w->s[i]; ++ } ++ if (point) ++ fmt[idx++] = '.'; ++ if (p != NULL) ++ { ++ if (p->s == NULL) ++ { ++ fmt[idx++] = '*'; ++ wpval[nint++] = p->i; ++ } ++ else ++ for (i = 0; p->s[i] != '\0'; i++) ++ fmt[idx++] = p->s[i]; ++ } ++ for (i = 0; length[i] != '\0'; i++) ++ fmt[idx++] = length[i]; ++ fmt[idx++] = c; ++ fmt[idx] = ':'; ++ fmt[idx + 1] = '\0'; ++ if (fputs (fmt, stdout) == EOF) ++ { ++ perror ("fputs"); ++ return -1; ++ } ++ fmt[idx++] = '\0'; ++ if (nint > 0) ++ { ++ result = printf ("%i:", wpval[0]); ++ if (result < 0) ++ { ++ perror ("printf"); ++ return -1; ++ } ++ if (nint > 1) ++ { ++ result = printf ("%i:", wpval[1]); ++ if (result < 0) ++ { ++ perror ("printf"); ++ return -1; ++ } ++ } ++ } ++ switch (nint) ++ { ++ case 0: ++ result = printf_under_test (fmt, val); ++ break; ++ case 1: ++ result = printf_under_test (fmt, wpval[0], val); ++ break; ++ case 2: ++ result = printf_under_test (fmt, wpval[0], wpval[1], val); ++ break; ++ default: ++ fputs ("Broken test, nint > 2\n", stderr); ++ return -1; ++ } ++ if (result < 0) ++ return -1; ++ if (fputs (":\n", stdout) == EOF) ++ { ++ perror ("fputs"); ++ return -1; ++ } ++ return 0; ++} ++ ++/* Produce a list of records according to '%' and zero or more output ++ format flags already provided in FMT at indices 0..IDX-1, iterating ++ over widths and precisions defined in global WP array, any length ++ modifiers L, conversion C, and value VAL. Inline '0' is omitted for ++ the width, as it is a flag already handled among the flags supplied. ++ Precision is omitted where the conversion does not allow it. ++ ++ Return 0 on success, -1 on failure. */ ++ ++static int ++do_printf_flags (char *fmt, size_t idx, const char *l, char c, type_t val) ++{ ++ bool do_prec = strchr (PREC_FORMATS, c) != NULL; ++ size_t i; ++ ++ if (do_printf (fmt, idx, NULL, false, NULL, l, c, val) < 0) ++ return -1; ++ if (do_prec && do_printf (fmt, idx, NULL, true, NULL, l, c, val) < 0) ++ return -1; ++ for (i = 0; i < array_length (wp); i++) ++ { ++ size_t j; ++ ++ if (do_prec && do_printf (fmt, idx, NULL, true, wp + i, l, c, val) < 0) ++ return -1; ++ /* Inline '0' is a flag rather than width and is handled elsewhere. */ ++ if (wp[i].s != NULL && wp[i].s[0] == '0' && wp[i].s[1] == '\0') ++ continue; ++ if (do_printf (fmt, idx, wp + i, false, NULL, l, c, val) < 0) ++ return -1; ++ if (do_prec) ++ { ++ if (do_printf (fmt, idx, wp + i, true, NULL, l, c, val) < 0) ++ return -1; ++ for (j = 0; j < array_length (wp); j++) ++ if (do_printf (fmt, idx, wp + i, true, wp + j, l, c, val) < 0) ++ return -1; ++ } ++ } ++ return 0; ++} ++ ++/* Produce a list of records using the formatted output specifier ++ supplied in ARGV[1] preceded by any length modifier supplied in ++ the global LENGTH variable, iterating over format flags defined ++ in the global FLAGS array, and values supplied in the global VALS ++ array. Note that the output specifier supplied is not verified ++ against TYPE_T, so undefined behavior will result if this is used ++ incorrectly. ++ ++ If PREC is nonzero, then this record: ++ ++ prec: ++ ++ is produced at the beginning. Then for each VAL from VALS a block ++ of records is produced starting with: ++ ++ val: ++ ++ where VAL is formatted according to REF_FMT output format. The ++ block continues with records as shown with DO_PRINTF above using ++ flags iterated over according to TST_PRINTF_DUPS. ++ ++ See the top of this file for the definitions that have to be ++ provided by the source including this skeleton. */ ++ ++static int ++do_test (int argc, char *argv[]) ++{ ++ char fmt[100] = {'%'}; ++ size_t j; ++ size_t v; ++ char c; ++ ++ if (argc < 2 || *argv[1] == '\0') ++ { ++ fprintf (stderr, "Usage: %s \n", basename (argv[0])); ++ return EXIT_FAILURE; ++ } ++ ++ mtrace (); ++ ++ if (PREC && printf ("prec:%i\n", PREC) < 0) ++ { ++ perror ("printf"); ++ return EXIT_FAILURE; ++ } ++ ++ c = *argv[1]; ++ for (v = 0; v < array_length (vals); v++) ++ { ++ if (printf ("val:%" REF_FMT "\n", REF_VAL (vals[v])) < 0) ++ { ++ perror ("printf"); ++ return EXIT_FAILURE; ++ } ++ ++ if (do_printf_flags (fmt, 1, length, c, vals[v]) < 0) ++ return EXIT_FAILURE; ++ for (j = 0; j < array_length (flags); j++) ++ { ++ bool done = false; ++ size_t i[j + 1]; ++ size_t k; ++ ++ memset (i, 0, sizeof (i)); ++ while (!done) ++ { ++ bool skip = false; ++ size_t idx = 1; ++ char f; ++ ++ for (k = 0; k <= j; k++) ++ { ++ const char *s = flags[i[k]].s; ++ ++ if (s && strchr (s, c) == NULL) ++ skip = true; ++ if (!TST_PRINTF_DUPS && j > 1 && k > 0 && i[k] >= i[k - 1]) ++ skip = true; ++ if (skip) ++ break; ++ ++ f = flags[i[k]].f; ++ fmt[idx++] = f; ++ } ++ if (!skip && do_printf_flags (fmt, idx, length, c, vals[v]) < 0) ++ return EXIT_FAILURE; ++ for (k = 0; k <= j; k++) ++ { ++ i[k]++; ++ if (i[k] < array_length (flags)) ++ break; ++ else if (k == j) ++ done = true; ++ else ++ i[k] = 0; ++ } ++ } ++ } ++ } ++ ++ return EXIT_SUCCESS; ++} ++ ++/* Interpose 'dladdr' with a stub to speed up malloc tracing. */ ++ ++int ++dladdr (const void *, Dl_info *) ++{ ++ return 0; ++} ++ ++#define TEST_FUNCTION_ARGV do_test ++#include +diff --git a/stdio-common/tst-printf-format-uchar.sh b/stdio-common/tst-printf-format-uchar.sh +new file mode 100644 +index 0000000000000000..8385d479cccf597f +--- /dev/null ++++ b/stdio-common/tst-printf-format-uchar.sh +@@ -0,0 +1,40 @@ ++#!/bin/bash ++# Testing of unsigned char printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=0 ++ ++for f in o u x X; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-uchar $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-uint.sh b/stdio-common/tst-printf-format-uint.sh +new file mode 100644 +index 0000000000000000..6806c99ce0470f1a +--- /dev/null ++++ b/stdio-common/tst-printf-format-uint.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash ++# Testing of unsigned int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="4294967295" ++for AWK in "$AWK -M" "$AWK"; do ++ val=$(echo "$ref" | $AWK '{ printf "%d\n", $1 }' 2>&1) || continue ++ test "$val" = "$ref" && status=0 && break ++done ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++for f in o u x X; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-uint $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-ullong.sh b/stdio-common/tst-printf-format-ullong.sh +new file mode 100644 +index 0000000000000000..c4fa69c2d16f85ce +--- /dev/null ++++ b/stdio-common/tst-printf-format-ullong.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash ++# Testing of unsigned long long int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="18446744073709551615" ++for AWK in "$AWK -M" "$AWK"; do ++ val=$(echo "$ref" | $AWK '{ printf "%d\n", $1 }' 2>&1) || continue ++ test "$val" = "$ref" && status=0 && break ++done ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++for f in o u x X; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-ullong $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-ulong.sh b/stdio-common/tst-printf-format-ulong.sh +new file mode 100644 +index 0000000000000000..fce881afe3c0be72 +--- /dev/null ++++ b/stdio-common/tst-printf-format-ulong.sh +@@ -0,0 +1,53 @@ ++#!/bin/bash ++# Testing of unsigned long int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=77 ++ ++# Verify that AWK can handle the range required. It also catches: ++# "gawk: warning: -M ignored: MPFR/GMP support not compiled in" ++# message produced where bignum support is not there, which is the ++# only indication as the use of '-M' does not affect the exit status ++# in this case. ++ref="18446744073709551615" ++for AWK in "$AWK -M" "$AWK"; do ++ val=$(echo "$ref" | $AWK '{ printf "%d\n", $1 }' 2>&1) || continue ++ test "$val" = "$ref" && status=0 && break ++done ++ ++test $status -eq 0 || { echo "No working AWK found" && exit $status; } ++ ++for f in o u x X; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-ulong $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format-ushort.sh b/stdio-common/tst-printf-format-ushort.sh +new file mode 100644 +index 0000000000000000..2f411b777e67e220 +--- /dev/null ++++ b/stdio-common/tst-printf-format-ushort.sh +@@ -0,0 +1,40 @@ ++#!/bin/bash ++# Testing of unsigned short int printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++xprintf=$1; shift ++common_objpfx=$1; shift ++test_program_prefix=$1; shift ++ ++AWK=${AWK:-awk} ++ ++status=0 ++ ++for f in o u x X; do ++ echo Verifying $f ++ (set -o pipefail ++ ${test_program_prefix} \ ++ ${common_objpfx}stdio-common/tst-printf-format-${xprintf}-ushort $f | ++ $AWK -f tst-printf-format.awk 2>&1 | ++ head -n 1 | sed "s/^/Conversion $f output error, first line:\n/") 2>&1 || ++ status=1 ++done ++ ++exit $status +diff --git a/stdio-common/tst-printf-format.awk b/stdio-common/tst-printf-format.awk +new file mode 100644 +index 0000000000000000..8b4bc7b1e45202eb +--- /dev/null ++++ b/stdio-common/tst-printf-format.awk +@@ -0,0 +1,127 @@ ++# Testing of printf conversions. ++# Copyright (C) 2024 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 ++# . ++ ++BEGIN { ++ FS = ":" ++} ++ ++/^prec:/ { ++ PREC = $2 ++ next ++} ++ ++/^val:/ { ++ val = $2 ++ # Prepend "+" for +Inf or +NaN value lacking a sign, because gawk ++ # interpretes them as strings rather than numeric values in the ++ # non-bignum mode unless a sign has been explicitly given. Keep ++ # original 'val' for reporting. ++ value = gensub(/^(INF|NAN|inf|nan)/, "+\\1", 1, val) ++ next ++} ++ ++/^%/ { ++ # Discard the trailing empty field, used to improve legibility of data. ++ input = $--NF ++ format = $1 ++ width = $2 ++ precision = "." $(NF - 1) ++ # Discard any negative precision, which is to be taken as if omitted. ++ sub(/\.-.*/, "", precision) ++ # Simplify handling and paste the precision and width specified as ++ # arguments to '*' directly into the format. ++ sub(/\.\*/, precision, format) ++ sub(/\*/, width, format) ++ # Discard length modifiers. They are only relevant to C data types. ++ sub(/([DHLjhltz]|wf?[1-9][0-9]*)/, "", format) ++ # Discard the '#' flag with the octal conversion if output starts with ++ # 0 in the absence of this flag. In that case no extra 0 is supposed ++ # to be produced, but gawk prepends it anyway. ++ if (format ~ /#.*o/) ++ { ++ tmpfmt = gensub(/#/, "", "g", format) ++ tmpout = sprintf(tmpfmt, value) ++ if (tmpout ~ /^ *0/) ++ format = tmpfmt ++ } ++ # Likewise with the hexadecimal conversion where zero value with the ++ # precision of zero is supposed to produce no characters, but gawk ++ # outputs 0 instead. ++ else if (format ~ /#.*[Xx]/) ++ { ++ tmpfmt = gensub(/#/, "", "g", format) ++ tmpout = sprintf(tmpfmt, value) ++ if (tmpout ~ /^ *$/) ++ format = tmpfmt ++ } ++ # AWK interpretes input opportunistically as a number, which interferes ++ # with how the 'c' conversion works: "a" input will result in "a" output ++ # however "0" input will result in "^@" output rather than "0". Force ++ # the value to be interpreted as a string then, by appending "". ++ output = sprintf(format, value "") ++ # Make up for various anomalies with the handling of +/-Inf and +/-NaN ++ # values and reprint the output produced using the string conversion, ++ # with the field width carried over and the relevant flags handled by ++ # hand. ++ if (format ~ /[EFGefg]/ && value ~ /(INF|NAN|inf|nan)/) ++ { ++ minus = format ~ /-/ ? "-" : "" ++ sign = value ~ /-/ ? "-" : format ~ /\+/ ? "+" : format ~ / / ? " " : "" ++ if (format ~ /^%[^\.1-9]*[1-9][0-9]*/) ++ width = gensub(/^%[^\.1-9]*([1-9][0-9]*).*$/, "\\1", 1, format) ++ else ++ width = "" ++ output = gensub(/[-+ ]/, "", "g", output) ++ output = sprintf("%" minus width "s", sign output) ++ } ++ # Produce "+" where the '+' flag has been used with a signed integer ++ # conversion for zero value, observing any field width in effect. ++ # In that case "+" is always supposed to be produced, but with the ++ # precision of zero gawk in the non-bignum mode produces any padding ++ # requested only. ++ else if (format ~ /\+.*[di]/ && value == 0) ++ { ++ output = gensub(/^( *) $/, format ~ /-/ ? "+\\1" : "\\1+", 1, output) ++ output = gensub(/^$/, "+", 1, output) ++ } ++ # Produce " " where the space flag has been used with a signed integer ++ # conversion for zero value. In that case at least one " " is ++ # supposed to be produced, but with the precision of zero gawk in the ++ # non-bignum mode produces nothing. ++ else if (format ~ / .*[di]/ && value == 0) ++ { ++ output = gensub(/^$/, " ", 1, output) ++ } ++ if (output != input) ++ { ++ printf "(\"%s\"%s%s, %s) => \"%s\", expected \"%s\"\n", \ ++ $1, (NF > 2 ? ", " $2 : ""), (NF > 3 ? ", " $3 : ""), val, \ ++ input, output > "/dev/stderr" ++ status = 1 ++ } ++ next ++} ++ ++{ ++ printf "unrecognized input: \"%s\"\n", $0 > "/dev/stderr" ++ status = 1 ++} ++ ++END { ++ exit status ++} +diff --git a/stdio-common/tst-printf-format.sh b/stdio-common/tst-printf-format.sh +new file mode 100644 +index 0000000000000000..466c4a5f4feac231 +--- /dev/null ++++ b/stdio-common/tst-printf-format.sh +@@ -0,0 +1,39 @@ ++#!/bin/bash ++# Formatted printf output test script dispatcher. ++# Copyright (C) 2024 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 ++# . ++ ++set -e ++ ++output=${1##*/}; shift ++ ++tmp=${output#tst-printf-format-} ++tmp=${tmp%.out} ++ ++# We are given the name of the make target in $1. With the common prefix ++# and suffix both removed we are left with the inner part, which encodes ++# the function under test, the conversion type, and optionally the format ++# specifier, all separated with hyphens, i.e. F-T-S or F-T. Extract them ++# and call the script corresponding to the conversion type, passing the ++# function under test and any format specifier as arguments. ++ ++xprintf=${tmp%%-*}; tmp=${tmp#*-} ++conv=${tmp%%-*}; tmp=${tmp#${conv}} ++fmt=${tmp#*-} ++script=tst-printf-format-$conv.sh ++ ++exec ${BASH:-bash} $script $xprintf $fmt "$@" diff --git a/glibc-RHEL-46725-10.patch b/glibc-RHEL-46725-10.patch new file mode 100644 index 0000000..95d1f17 --- /dev/null +++ b/glibc-RHEL-46725-10.patch @@ -0,0 +1,428 @@ +commit 6018ba05c01b1e17d77742a123e8c443f8fc713c +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted vfprintf output specifiers + + Wire vfprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 437acef216b04237..dc825f415af283ad 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s sn v vas vd ++xprintf-funcs := p as d f s sn v vas vd vf + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-vf-c.c b/stdio-common/tst-printf-format-vf-c.c +new file mode 100644 +index 0000000000000000..b31b551327bb4ebe +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-vf-char.c b/stdio-common/tst-printf-format-vf-char.c +new file mode 100644 +index 0000000000000000..daa2886adb9f1636 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-vf-double.c b/stdio-common/tst-printf-format-vf-double.c +new file mode 100644 +index 0000000000000000..63ec8c0cae6c272e +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-vf-int.c b/stdio-common/tst-printf-format-vf-int.c +new file mode 100644 +index 0000000000000000..e687099b1052d040 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-vf-ldouble.c b/stdio-common/tst-printf-format-vf-ldouble.c +new file mode 100644 +index 0000000000000000..801e359dab8ca159 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-vf-llong.c b/stdio-common/tst-printf-format-vf-llong.c +new file mode 100644 +index 0000000000000000..a1b9ae340c4aa5ff +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-vf-long.c b/stdio-common/tst-printf-format-vf-long.c +new file mode 100644 +index 0000000000000000..7afc127b844d1e10 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-vf-s.c b/stdio-common/tst-printf-format-vf-s.c +new file mode 100644 +index 0000000000000000..6faa6d0dfe4b4132 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-vf-short.c b/stdio-common/tst-printf-format-vf-short.c +new file mode 100644 +index 0000000000000000..c3d17ca501974f83 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-vf-uchar.c b/stdio-common/tst-printf-format-vf-uchar.c +new file mode 100644 +index 0000000000000000..643438c693abf51f +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-vf-uint.c b/stdio-common/tst-printf-format-vf-uint.c +new file mode 100644 +index 0000000000000000..844192cc9ccf5db8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-vf-ullong.c b/stdio-common/tst-printf-format-vf-ullong.c +new file mode 100644 +index 0000000000000000..ab58abd7f8c4e267 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-vf-ulong.c b/stdio-common/tst-printf-format-vf-ulong.c +new file mode 100644 +index 0000000000000000..e76251f9d0e3337f +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-vf-ushort.c b/stdio-common/tst-printf-format-vf-ushort.c +new file mode 100644 +index 0000000000000000..bf78a919a6599054 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vfprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vf.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-vf.h b/stdio-common/tst-printf-format-vf.h +new file mode 100644 +index 0000000000000000..f824364f4c041ab8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vf.h +@@ -0,0 +1,34 @@ ++/* Test feature wrapper for formatted 'vfprintf' output. ++ Copyright (C) 2024 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 ++ ++static int ++printf_under_test (const char *restrict fmt, ...) ++{ ++ va_list ap; ++ int result; ++ ++ va_start (ap, fmt); ++ result = vfprintf (stdout, fmt, ap); ++ va_end (ap); ++ if (result < 0) ++ perror ("vfprintf"); ++ return result; ++} diff --git a/glibc-RHEL-46725-11.patch b/glibc-RHEL-46725-11.patch new file mode 100644 index 0000000..dc87993 --- /dev/null +++ b/glibc-RHEL-46725-11.patch @@ -0,0 +1,458 @@ +commit ac72dd90905e1693c108c9f36f0c7e79d6ad5501 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted vsprintf output specifiers + + Wire vsprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index dc825f415af283ad..f0c414427ab109c7 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s sn v vas vd vf ++xprintf-funcs := p as d f s sn v vas vd vf vs + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-vs-c.c b/stdio-common/tst-printf-format-vs-c.c +new file mode 100644 +index 0000000000000000..72bcb5f04957c4ef +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-vs-char.c b/stdio-common/tst-printf-format-vs-char.c +new file mode 100644 +index 0000000000000000..30135cf1be1616ac +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-vs-double.c b/stdio-common/tst-printf-format-vs-double.c +new file mode 100644 +index 0000000000000000..56290d383ebc33c8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-vs-int.c b/stdio-common/tst-printf-format-vs-int.c +new file mode 100644 +index 0000000000000000..f954e1f4f8277c64 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-vs-ldouble.c b/stdio-common/tst-printf-format-vs-ldouble.c +new file mode 100644 +index 0000000000000000..3088e42813abd537 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-vs-llong.c b/stdio-common/tst-printf-format-vs-llong.c +new file mode 100644 +index 0000000000000000..348ec2c3d73b8f88 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-vs-long.c b/stdio-common/tst-printf-format-vs-long.c +new file mode 100644 +index 0000000000000000..874e3ba479eda8fb +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-vs-s.c b/stdio-common/tst-printf-format-vs-s.c +new file mode 100644 +index 0000000000000000..051f1b79bf2cb028 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-vs-short.c b/stdio-common/tst-printf-format-vs-short.c +new file mode 100644 +index 0000000000000000..36595a82b445e8a3 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-vs-uchar.c b/stdio-common/tst-printf-format-vs-uchar.c +new file mode 100644 +index 0000000000000000..8e35614110bd7d57 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-vs-uint.c b/stdio-common/tst-printf-format-vs-uint.c +new file mode 100644 +index 0000000000000000..4a13d6c409ad4245 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-vs-ullong.c b/stdio-common/tst-printf-format-vs-ullong.c +new file mode 100644 +index 0000000000000000..313dfaf02bda3059 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-vs-ulong.c b/stdio-common/tst-printf-format-vs-ulong.c +new file mode 100644 +index 0000000000000000..5ab7e2e7fe9b237a +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-vs-ushort.c b/stdio-common/tst-printf-format-vs-ushort.c +new file mode 100644 +index 0000000000000000..a4af138a2f8485ab +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vs.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-vs.h b/stdio-common/tst-printf-format-vs.h +new file mode 100644 +index 0000000000000000..e00e1b085bc58150 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vs.h +@@ -0,0 +1,64 @@ ++/* Test feature wrapper for formatted 'vsprintf' output. ++ Copyright (C) 2024 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 ++#include ++ ++#include ++ ++#define SPRINTF_BUFFER_SIZE 65536 ++ ++static struct support_next_to_fault ntf; ++ ++#define PREPARE printf_under_test_init ++static void ++printf_under_test_init (int argc, char **argv) ++{ ++ ntf = support_next_to_fault_allocate (SPRINTF_BUFFER_SIZE); ++} ++ ++static void __attribute__ ((destructor)) ++printf_under_test_fini (void) ++{ ++ support_next_to_fault_free (&ntf); ++} ++ ++static int ++printf_under_test (const char *restrict fmt, ...) ++{ ++ char *str = ntf.buffer; ++ va_list ap; ++ int result; ++ ++ va_start (ap, fmt); ++ result = vsprintf (str, fmt, ap); ++ va_end (ap); ++ if (result < 0) ++ { ++ perror ("vsprintf"); ++ goto out; ++ } ++ if (fwrite (str, sizeof (*str), result, stdout) != result) ++ { ++ perror ("fwrite"); ++ result = -1; ++ } ++out: ++ return result; ++} diff --git a/glibc-RHEL-46725-12.patch b/glibc-RHEL-46725-12.patch new file mode 100644 index 0000000..4017bda --- /dev/null +++ b/glibc-RHEL-46725-12.patch @@ -0,0 +1,458 @@ +commit 11a2169e4066e6b848f1e6e4c31ec4e2210cecd8 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted vsnprintf output specifiers + + Wire vsnprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index f0c414427ab109c7..905a5a510f1e5bc6 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s sn v vas vd vf vs ++xprintf-funcs := p as d f s sn v vas vd vf vs vsn + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-vsn-c.c b/stdio-common/tst-printf-format-vsn-c.c +new file mode 100644 +index 0000000000000000..47c8a0f5dfbddb49 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-vsn-char.c b/stdio-common/tst-printf-format-vsn-char.c +new file mode 100644 +index 0000000000000000..48d4393a46d80e33 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-vsn-double.c b/stdio-common/tst-printf-format-vsn-double.c +new file mode 100644 +index 0000000000000000..06c1003fb5fde4b0 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-vsn-int.c b/stdio-common/tst-printf-format-vsn-int.c +new file mode 100644 +index 0000000000000000..2aae92616f2f6007 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-vsn-ldouble.c b/stdio-common/tst-printf-format-vsn-ldouble.c +new file mode 100644 +index 0000000000000000..0b5aafb124307526 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-vsn-llong.c b/stdio-common/tst-printf-format-vsn-llong.c +new file mode 100644 +index 0000000000000000..8e79b8384f6858c6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-vsn-long.c b/stdio-common/tst-printf-format-vsn-long.c +new file mode 100644 +index 0000000000000000..e94f7dec23ece2ca +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-vsn-s.c b/stdio-common/tst-printf-format-vsn-s.c +new file mode 100644 +index 0000000000000000..efd8a4c23f5f42e6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-vsn-short.c b/stdio-common/tst-printf-format-vsn-short.c +new file mode 100644 +index 0000000000000000..3d375b59e7a990f0 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-vsn-uchar.c b/stdio-common/tst-printf-format-vsn-uchar.c +new file mode 100644 +index 0000000000000000..6d0f396481d3e2d6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-vsn-uint.c b/stdio-common/tst-printf-format-vsn-uint.c +new file mode 100644 +index 0000000000000000..b637f7bdb11f7913 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-vsn-ullong.c b/stdio-common/tst-printf-format-vsn-ullong.c +new file mode 100644 +index 0000000000000000..d2442715f087acaf +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-vsn-ulong.c b/stdio-common/tst-printf-format-vsn-ulong.c +new file mode 100644 +index 0000000000000000..67417d174043a605 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-vsn-ushort.c b/stdio-common/tst-printf-format-vsn-ushort.c +new file mode 100644 +index 0000000000000000..396ea43ae7067c86 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vsnprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vsn.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-vsn.h b/stdio-common/tst-printf-format-vsn.h +new file mode 100644 +index 0000000000000000..4f25f1af767dc221 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vsn.h +@@ -0,0 +1,64 @@ ++/* Test feature wrapper for formatted 'vsnprintf' output. ++ Copyright (C) 2024 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 ++#include ++ ++#include ++ ++#define SPRINTF_BUFFER_SIZE 65536 ++ ++static struct support_next_to_fault ntf; ++ ++#define PREPARE printf_under_test_init ++static void ++printf_under_test_init (int argc, char **argv) ++{ ++ ntf = support_next_to_fault_allocate (SPRINTF_BUFFER_SIZE); ++} ++ ++static void __attribute__ ((destructor)) ++printf_under_test_fini (void) ++{ ++ support_next_to_fault_free (&ntf); ++} ++ ++static int ++printf_under_test (const char *restrict fmt, ...) ++{ ++ char *str = ntf.buffer; ++ va_list ap; ++ int result; ++ ++ va_start (ap, fmt); ++ result = vsnprintf (str, ntf.length, fmt, ap); ++ va_end (ap); ++ if (result < 0) ++ { ++ perror ("vsnprintf"); ++ goto out; ++ } ++ if (fwrite (str, sizeof (*str), result, stdout) != result) ++ { ++ perror ("fwrite"); ++ result = -1; ++ } ++out: ++ return result; ++} diff --git a/glibc-RHEL-46725-2.patch b/glibc-RHEL-46725-2.patch new file mode 100644 index 0000000..03f480f --- /dev/null +++ b/glibc-RHEL-46725-2.patch @@ -0,0 +1,459 @@ +commit b350a60b6ecd77b7ec30c7969de1df8b73642e55 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted asprintf output specifiers + + Wire asprintf into test infrastructure for formatted printf output + specifiers. + + Owing to mtrace logging of lots of memory allocation calls these tests + take a considerable amount of time to complete, except for the character + conversion, taking from 00m20s for 'tst-printf-format-as-s --direct s', + through 01m10s and 03m53s for 'tst-printf-format-as-char --direct i' and + 'tst-printf-format-as-double --direct f' respectively, to 19m24s for + 'tst-printf-format-as-ldouble --direct f', all in standalone execution + from NFS on a RISC-V FU740@1.2GHz system and with output redirected over + 100Mbps network via SSH. It is with the skeleton's stub implementation + of dladdr(3); execution times with regular dladdr(3) are up to over + twice longer. + + Set timeouts for the tests accordingly then, with a global default for + all the asprintf tests, and then individual higher settings for double + and long double tests each. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 0a45dcb4f45c0a5d..da279a969f7a8785 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p ++xprintf-funcs := p as + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-as-c.c b/stdio-common/tst-printf-format-as-c.c +new file mode 100644 +index 0000000000000000..9eaf7aec73201b4d +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-as-char.c b/stdio-common/tst-printf-format-as-char.c +new file mode 100644 +index 0000000000000000..d9266d5760fb8808 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-as-double.c b/stdio-common/tst-printf-format-as-double.c +new file mode 100644 +index 0000000000000000..370ce8c11bd94fe8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-double.c +@@ -0,0 +1,22 @@ ++/* Test for formatted 'asprintf' output for double conversions. ++ Copyright (C) 2024 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 ++ . */ ++ ++#define TIMEOUT (DEFAULT_TIMEOUT * 32) ++ ++#include "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-as-int.c b/stdio-common/tst-printf-format-as-int.c +new file mode 100644 +index 0000000000000000..e6e10a9769f079a4 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-as-ldouble.c b/stdio-common/tst-printf-format-as-ldouble.c +new file mode 100644 +index 0000000000000000..e7f72208cec76078 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-ldouble.c +@@ -0,0 +1,22 @@ ++/* Test for formatted 'asprintf' output for long double conversions. ++ Copyright (C) 2024 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 ++ . */ ++ ++#define TIMEOUT (DEFAULT_TIMEOUT * 128) ++ ++#include "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-as-llong.c b/stdio-common/tst-printf-format-as-llong.c +new file mode 100644 +index 0000000000000000..beaad73c235c344e +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-as-long.c b/stdio-common/tst-printf-format-as-long.c +new file mode 100644 +index 0000000000000000..7d968a873c3b5e29 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-as-s.c b/stdio-common/tst-printf-format-as-s.c +new file mode 100644 +index 0000000000000000..baa883d5316cbf2f +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-as-short.c b/stdio-common/tst-printf-format-as-short.c +new file mode 100644 +index 0000000000000000..8d0b078815f299a6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-as-uchar.c b/stdio-common/tst-printf-format-as-uchar.c +new file mode 100644 +index 0000000000000000..8e46254a2f32b457 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-as-uint.c b/stdio-common/tst-printf-format-as-uint.c +new file mode 100644 +index 0000000000000000..8cf38d71a2f53358 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-as-ullong.c b/stdio-common/tst-printf-format-as-ullong.c +new file mode 100644 +index 0000000000000000..30b31ed8f7b36ae1 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-as-ulong.c b/stdio-common/tst-printf-format-as-ulong.c +new file mode 100644 +index 0000000000000000..9b108aa2b5132686 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-as-ushort.c b/stdio-common/tst-printf-format-as-ushort.c +new file mode 100644 +index 0000000000000000..44b912fc38c46d28 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'asprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-as.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-as.h b/stdio-common/tst-printf-format-as.h +new file mode 100644 +index 0000000000000000..c30d2e2c42822f24 +--- /dev/null ++++ b/stdio-common/tst-printf-format-as.h +@@ -0,0 +1,46 @@ ++/* Test feature wrapper for formatted 'asprintf' output. ++ Copyright (C) 2024 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 ++ ++#define printf_under_test(...) \ ++({ \ ++ __label__ out; \ ++ int result; \ ++ char *str; \ ++ \ ++ result = asprintf (&str, __VA_ARGS__); \ ++ if (result < 0) \ ++ { \ ++ perror ("asprintf"); \ ++ goto out; \ ++ } \ ++ if (fwrite (str, sizeof (*str), result, stdout) != result) \ ++ { \ ++ perror ("fwrite"); \ ++ result = -1; \ ++ } \ ++ free (str); \ ++out: \ ++ result; \ ++}) ++ ++#ifndef TIMEOUT ++# define TIMEOUT (DEFAULT_TIMEOUT * 12) ++#endif diff --git a/glibc-RHEL-46725-3.patch b/glibc-RHEL-46725-3.patch new file mode 100644 index 0000000..3312e21 --- /dev/null +++ b/glibc-RHEL-46725-3.patch @@ -0,0 +1,452 @@ +commit b3e8a756ad569fd31181b74b3729d29df3eb55f3 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted dprintf output specifiers + + Wire dprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index da279a969f7a8785..2bc830597085678a 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as ++xprintf-funcs := p as d + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-d-c.c b/stdio-common/tst-printf-format-d-c.c +new file mode 100644 +index 0000000000000000..61fd06654d2a957e +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-d-char.c b/stdio-common/tst-printf-format-d-char.c +new file mode 100644 +index 0000000000000000..baa6e1683e923841 +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-d-double.c b/stdio-common/tst-printf-format-d-double.c +new file mode 100644 +index 0000000000000000..e432a9570d46e776 +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-d-int.c b/stdio-common/tst-printf-format-d-int.c +new file mode 100644 +index 0000000000000000..6d59b23517b54a85 +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-d-ldouble.c b/stdio-common/tst-printf-format-d-ldouble.c +new file mode 100644 +index 0000000000000000..67a2bae1bc4e0301 +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-d-llong.c b/stdio-common/tst-printf-format-d-llong.c +new file mode 100644 +index 0000000000000000..950a2b84b9fc1abc +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-d-long.c b/stdio-common/tst-printf-format-d-long.c +new file mode 100644 +index 0000000000000000..4fabb41b0b013011 +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-d-s.c b/stdio-common/tst-printf-format-d-s.c +new file mode 100644 +index 0000000000000000..1ef896e6e7d146bc +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-d-short.c b/stdio-common/tst-printf-format-d-short.c +new file mode 100644 +index 0000000000000000..17767bb30d2f0d3e +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-d-uchar.c b/stdio-common/tst-printf-format-d-uchar.c +new file mode 100644 +index 0000000000000000..732479ecab2cdc4e +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-d-uint.c b/stdio-common/tst-printf-format-d-uint.c +new file mode 100644 +index 0000000000000000..5b68aec803f653ac +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-d-ullong.c b/stdio-common/tst-printf-format-d-ullong.c +new file mode 100644 +index 0000000000000000..0e20a1dccd58e84b +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-d-ulong.c b/stdio-common/tst-printf-format-d-ulong.c +new file mode 100644 +index 0000000000000000..62085ace806b6d33 +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-d-ushort.c b/stdio-common/tst-printf-format-d-ushort.c +new file mode 100644 +index 0000000000000000..7d8ef76d60b70e2d +--- /dev/null ++++ b/stdio-common/tst-printf-format-d-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'dprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-d.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-d.h b/stdio-common/tst-printf-format-d.h +new file mode 100644 +index 0000000000000000..af7f26c17bde88ea +--- /dev/null ++++ b/stdio-common/tst-printf-format-d.h +@@ -0,0 +1,58 @@ ++/* Test feature wrapper for formatted 'dprintf' output. ++ Copyright (C) 2024 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 ++#include ++ ++/* We need to go through the POSIX-mandated dance to switch between ++ handles on an open file description. */ ++ ++#define printf_under_test(...) \ ++({ \ ++ __label__ out; \ ++ int result; \ ++ \ ++ result = fflush (stdout); \ ++ if (result == EOF) \ ++ { \ ++ perror ("fflush"); \ ++ goto out; \ ++ } \ ++ result = lseek (STDOUT_FILENO, 0, SEEK_END); \ ++ if (result < 0 && errno == ESPIPE) \ ++ result = 0; \ ++ if (result < 0) \ ++ { \ ++ perror ("lseek"); \ ++ goto out; \ ++ } \ ++ result = dprintf (STDOUT_FILENO, __VA_ARGS__); \ ++ if (result < 0) \ ++ { \ ++ perror ("dprintf"); \ ++ goto out; \ ++ } \ ++ result = fseek (stdout, 0, SEEK_END); \ ++ if (result < 0 && errno == ESPIPE) \ ++ result = 0; \ ++ if (result < 0) \ ++ perror ("fseek"); \ ++out: \ ++ result; \ ++}) diff --git a/glibc-RHEL-46725-4.patch b/glibc-RHEL-46725-4.patch new file mode 100644 index 0000000..5a69126 --- /dev/null +++ b/glibc-RHEL-46725-4.patch @@ -0,0 +1,423 @@ +commit 1dc5cdc3da19e10d47e50a5ea2ea3ce62ee2fa82 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted fprintf output specifiers + + Wire fprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 2bc830597085678a..3a812073784fa3b6 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d ++xprintf-funcs := p as d f + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-f-c.c b/stdio-common/tst-printf-format-f-c.c +new file mode 100644 +index 0000000000000000..1db9e2b5f3bb2d32 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-f-char.c b/stdio-common/tst-printf-format-f-char.c +new file mode 100644 +index 0000000000000000..a492f318620bc82e +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-f-double.c b/stdio-common/tst-printf-format-f-double.c +new file mode 100644 +index 0000000000000000..906ef0b90b9e7d1d +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-f-int.c b/stdio-common/tst-printf-format-f-int.c +new file mode 100644 +index 0000000000000000..92dc0c919771ae26 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-f-ldouble.c b/stdio-common/tst-printf-format-f-ldouble.c +new file mode 100644 +index 0000000000000000..0a0c88d64c873061 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-f-llong.c b/stdio-common/tst-printf-format-f-llong.c +new file mode 100644 +index 0000000000000000..ceb8d035faaf0a12 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-f-long.c b/stdio-common/tst-printf-format-f-long.c +new file mode 100644 +index 0000000000000000..a4a5dca5ebd7b3a4 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-f-s.c b/stdio-common/tst-printf-format-f-s.c +new file mode 100644 +index 0000000000000000..da0e0f8bacab6992 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-f-short.c b/stdio-common/tst-printf-format-f-short.c +new file mode 100644 +index 0000000000000000..3abd134d0aeeef87 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-f-uchar.c b/stdio-common/tst-printf-format-f-uchar.c +new file mode 100644 +index 0000000000000000..f104cde37b322b60 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-f-uint.c b/stdio-common/tst-printf-format-f-uint.c +new file mode 100644 +index 0000000000000000..0e1fdb4b367032a2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-f-ullong.c b/stdio-common/tst-printf-format-f-ullong.c +new file mode 100644 +index 0000000000000000..b4669fcbb7dd3282 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-f-ulong.c b/stdio-common/tst-printf-format-f-ulong.c +new file mode 100644 +index 0000000000000000..3f4f900362a153b5 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-f-ushort.c b/stdio-common/tst-printf-format-f-ushort.c +new file mode 100644 +index 0000000000000000..d49c2371403e20a6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'fprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-f.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-f.h b/stdio-common/tst-printf-format-f.h +new file mode 100644 +index 0000000000000000..efb3283a032f44a7 +--- /dev/null ++++ b/stdio-common/tst-printf-format-f.h +@@ -0,0 +1,29 @@ ++/* Test feature wrapper for formatted 'fprintf' output. ++ Copyright (C) 2024 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 ++ ++#define printf_under_test(...) \ ++({ \ ++ int result; \ ++ \ ++ result = fprintf (stdout, __VA_ARGS__); \ ++ if (result < 0) \ ++ perror ("fprintf"); \ ++ result; \ ++}) diff --git a/glibc-RHEL-46725-5.patch b/glibc-RHEL-46725-5.patch new file mode 100644 index 0000000..411003a --- /dev/null +++ b/glibc-RHEL-46725-5.patch @@ -0,0 +1,454 @@ +commit c683ac8520e8064e7be3a22922d80849271290ac +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted sprintf output specifiers + + Wire sprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 3a812073784fa3b6..7522cd76cc26a3a5 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f ++xprintf-funcs := p as d f s + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-s-c.c b/stdio-common/tst-printf-format-s-c.c +new file mode 100644 +index 0000000000000000..87dad077b9c05216 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-s-char.c b/stdio-common/tst-printf-format-s-char.c +new file mode 100644 +index 0000000000000000..f67ac94a5dd70cf4 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-s-double.c b/stdio-common/tst-printf-format-s-double.c +new file mode 100644 +index 0000000000000000..16186b5dc55eabaf +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-s-int.c b/stdio-common/tst-printf-format-s-int.c +new file mode 100644 +index 0000000000000000..2ed7b2df471cd96d +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-s-ldouble.c b/stdio-common/tst-printf-format-s-ldouble.c +new file mode 100644 +index 0000000000000000..0362cc50f78ffdfa +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-s-llong.c b/stdio-common/tst-printf-format-s-llong.c +new file mode 100644 +index 0000000000000000..b49f84998a7e7ca2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-s-long.c b/stdio-common/tst-printf-format-s-long.c +new file mode 100644 +index 0000000000000000..49224d7f29d7e65c +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-s-s.c b/stdio-common/tst-printf-format-s-s.c +new file mode 100644 +index 0000000000000000..3a400f8907895db0 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-s-short.c b/stdio-common/tst-printf-format-s-short.c +new file mode 100644 +index 0000000000000000..c98a808cff51c52a +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-s-uchar.c b/stdio-common/tst-printf-format-s-uchar.c +new file mode 100644 +index 0000000000000000..befc36894975a9a1 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-s-uint.c b/stdio-common/tst-printf-format-s-uint.c +new file mode 100644 +index 0000000000000000..f3a4c49632a3be07 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-s-ullong.c b/stdio-common/tst-printf-format-s-ullong.c +new file mode 100644 +index 0000000000000000..4ce559037921e01f +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-s-ulong.c b/stdio-common/tst-printf-format-s-ulong.c +new file mode 100644 +index 0000000000000000..81f9eea893c194d2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-s-ushort.c b/stdio-common/tst-printf-format-s-ushort.c +new file mode 100644 +index 0000000000000000..4b1cca6e6cf6b342 +--- /dev/null ++++ b/stdio-common/tst-printf-format-s-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'sprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-s.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-s.h b/stdio-common/tst-printf-format-s.h +new file mode 100644 +index 0000000000000000..7d1e72cffb7b20fb +--- /dev/null ++++ b/stdio-common/tst-printf-format-s.h +@@ -0,0 +1,60 @@ ++/* Test feature wrapper for formatted 'sprintf' output. ++ Copyright (C) 2024 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 ++ ++#include ++ ++#define SPRINTF_BUFFER_SIZE 65536 ++ ++static struct support_next_to_fault ntf; ++ ++#define PREPARE printf_under_test_init ++static void ++printf_under_test_init (int argc, char **argv) ++{ ++ ntf = support_next_to_fault_allocate (SPRINTF_BUFFER_SIZE); ++} ++ ++static void __attribute__ ((destructor)) ++printf_under_test_fini (void) ++{ ++ support_next_to_fault_free (&ntf); ++} ++ ++#define printf_under_test(...) \ ++({ \ ++ __label__ out; \ ++ char *str = ntf.buffer; \ ++ int result; \ ++ \ ++ result = sprintf (str, __VA_ARGS__); \ ++ if (result < 0) \ ++ { \ ++ perror ("sprintf"); \ ++ goto out; \ ++ } \ ++ if (fwrite (str, sizeof (*str), result, stdout) != result) \ ++ { \ ++ perror ("fwrite"); \ ++ result = -1; \ ++ } \ ++out: \ ++ result; \ ++}) diff --git a/glibc-RHEL-46725-6.patch b/glibc-RHEL-46725-6.patch new file mode 100644 index 0000000..6d13904 --- /dev/null +++ b/glibc-RHEL-46725-6.patch @@ -0,0 +1,454 @@ +commit 0b6379cb98590c28088f017ddcc0edb8ad7d0131 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted snprintf output specifiers + + Wire snprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 7522cd76cc26a3a5..88b89ce13ffbadc4 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s ++xprintf-funcs := p as d f s sn + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-sn-c.c b/stdio-common/tst-printf-format-sn-c.c +new file mode 100644 +index 0000000000000000..59f51d635bc46d28 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-sn-char.c b/stdio-common/tst-printf-format-sn-char.c +new file mode 100644 +index 0000000000000000..8b682dd2d52f04d2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-sn-double.c b/stdio-common/tst-printf-format-sn-double.c +new file mode 100644 +index 0000000000000000..4719a58d84bda809 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-sn-int.c b/stdio-common/tst-printf-format-sn-int.c +new file mode 100644 +index 0000000000000000..94c42f246fc8ce49 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-sn-ldouble.c b/stdio-common/tst-printf-format-sn-ldouble.c +new file mode 100644 +index 0000000000000000..921f3ffe3b79a05d +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-sn-llong.c b/stdio-common/tst-printf-format-sn-llong.c +new file mode 100644 +index 0000000000000000..013552791e087d0c +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-sn-long.c b/stdio-common/tst-printf-format-sn-long.c +new file mode 100644 +index 0000000000000000..58c8912746c1108b +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-sn-s.c b/stdio-common/tst-printf-format-sn-s.c +new file mode 100644 +index 0000000000000000..aa3f170c14790926 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-sn-short.c b/stdio-common/tst-printf-format-sn-short.c +new file mode 100644 +index 0000000000000000..f7baa1211d16e203 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-sn-uchar.c b/stdio-common/tst-printf-format-sn-uchar.c +new file mode 100644 +index 0000000000000000..6ae5f121bd76ab9d +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-sn-uint.c b/stdio-common/tst-printf-format-sn-uint.c +new file mode 100644 +index 0000000000000000..f0a0c3063f89781a +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-sn-ullong.c b/stdio-common/tst-printf-format-sn-ullong.c +new file mode 100644 +index 0000000000000000..0dc0a50c4f2362a2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-sn-ulong.c b/stdio-common/tst-printf-format-sn-ulong.c +new file mode 100644 +index 0000000000000000..23ff5a27d7c25c34 +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-sn-ushort.c b/stdio-common/tst-printf-format-sn-ushort.c +new file mode 100644 +index 0000000000000000..1c5cffbeb414048e +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'snprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-sn.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-sn.h b/stdio-common/tst-printf-format-sn.h +new file mode 100644 +index 0000000000000000..ec2645bf57da8bbb +--- /dev/null ++++ b/stdio-common/tst-printf-format-sn.h +@@ -0,0 +1,60 @@ ++/* Test feature wrapper for formatted 'snprintf' output. ++ Copyright (C) 2024 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 ++ ++#include ++ ++#define SPRINTF_BUFFER_SIZE 65536 ++ ++static struct support_next_to_fault ntf; ++ ++#define PREPARE printf_under_test_init ++static void ++printf_under_test_init (int argc, char **argv) ++{ ++ ntf = support_next_to_fault_allocate (SPRINTF_BUFFER_SIZE); ++} ++ ++static void __attribute__ ((destructor)) ++printf_under_test_fini (void) ++{ ++ support_next_to_fault_free (&ntf); ++} ++ ++#define printf_under_test(...) \ ++({ \ ++ __label__ out; \ ++ char *str = ntf.buffer; \ ++ int result; \ ++ \ ++ result = snprintf (str, ntf.length, __VA_ARGS__); \ ++ if (result < 0) \ ++ { \ ++ perror ("snprintf"); \ ++ goto out; \ ++ } \ ++ if (fwrite (str, sizeof (*str), result, stdout) != result) \ ++ { \ ++ perror ("fwrite"); \ ++ result = -1; \ ++ } \ ++out: \ ++ result; \ ++}) diff --git a/glibc-RHEL-46725-7.patch b/glibc-RHEL-46725-7.patch new file mode 100644 index 0000000..d4ff4ba --- /dev/null +++ b/glibc-RHEL-46725-7.patch @@ -0,0 +1,428 @@ +commit bad554d9b4f10988eb7fdb814fbaa5e89416d781 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted vprintf output specifiers + + Wire vprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 88b89ce13ffbadc4..fd34891ea439c684 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s sn ++xprintf-funcs := p as d f s sn v + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-v-c.c b/stdio-common/tst-printf-format-v-c.c +new file mode 100644 +index 0000000000000000..94aa3042aaee6d97 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-v-char.c b/stdio-common/tst-printf-format-v-char.c +new file mode 100644 +index 0000000000000000..c813d81e53956295 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-v-double.c b/stdio-common/tst-printf-format-v-double.c +new file mode 100644 +index 0000000000000000..90cc1704eb3da2f3 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-v-int.c b/stdio-common/tst-printf-format-v-int.c +new file mode 100644 +index 0000000000000000..6529425b263975c8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-v-ldouble.c b/stdio-common/tst-printf-format-v-ldouble.c +new file mode 100644 +index 0000000000000000..813f4a510dc833cc +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-v-llong.c b/stdio-common/tst-printf-format-v-llong.c +new file mode 100644 +index 0000000000000000..270ad08bf5e948fd +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-v-long.c b/stdio-common/tst-printf-format-v-long.c +new file mode 100644 +index 0000000000000000..2f5f653fecb25040 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-v-s.c b/stdio-common/tst-printf-format-v-s.c +new file mode 100644 +index 0000000000000000..ebc253b3e83291f2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-v-short.c b/stdio-common/tst-printf-format-v-short.c +new file mode 100644 +index 0000000000000000..92a59d9fd3972f1e +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-v-uchar.c b/stdio-common/tst-printf-format-v-uchar.c +new file mode 100644 +index 0000000000000000..045ffd2864f8158f +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-v-uint.c b/stdio-common/tst-printf-format-v-uint.c +new file mode 100644 +index 0000000000000000..17b1ce3aa7780209 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-v-ullong.c b/stdio-common/tst-printf-format-v-ullong.c +new file mode 100644 +index 0000000000000000..590b04f339e01cf6 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-v-ulong.c b/stdio-common/tst-printf-format-v-ulong.c +new file mode 100644 +index 0000000000000000..6747677a42b38e37 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-v-ushort.c b/stdio-common/tst-printf-format-v-ushort.c +new file mode 100644 +index 0000000000000000..1e782715627f7b77 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-v.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-v.h b/stdio-common/tst-printf-format-v.h +new file mode 100644 +index 0000000000000000..711b290b59df8781 +--- /dev/null ++++ b/stdio-common/tst-printf-format-v.h +@@ -0,0 +1,34 @@ ++/* Test feature wrapper for formatted 'vprintf' output. ++ Copyright (C) 2024 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 ++ ++static int ++printf_under_test (const char *restrict fmt, ...) ++{ ++ va_list ap; ++ int result; ++ ++ va_start (ap, fmt); ++ result = vprintf (fmt, ap); ++ va_end (ap); ++ if (result < 0) ++ perror ("vprintf"); ++ return result; ++} diff --git a/glibc-RHEL-46725-8.patch b/glibc-RHEL-46725-8.patch new file mode 100644 index 0000000..8f0a2be --- /dev/null +++ b/glibc-RHEL-46725-8.patch @@ -0,0 +1,454 @@ +commit 349670f8093d920d4d683472c88029f6901f7ae7 +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted vasprintf output specifiers + + Wire vasprintf into test infrastructure for formatted printf output + specifiers. + + Owing to mtrace logging these tests take amounts of time to complete + similar to those of corresponding asprintf tests, so set timeouts for + the tests accordingly, with a global default for all the vasprintf + tests, and then individual higher settings for double and long double + tests each. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index fd34891ea439c684..2675d7741fe496d4 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s sn v ++xprintf-funcs := p as d f s sn v vas + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-vas-c.c b/stdio-common/tst-printf-format-vas-c.c +new file mode 100644 +index 0000000000000000..f8cf814c8c3bc293 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-vas-char.c b/stdio-common/tst-printf-format-vas-char.c +new file mode 100644 +index 0000000000000000..39c6e73977f3f32f +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-vas-double.c b/stdio-common/tst-printf-format-vas-double.c +new file mode 100644 +index 0000000000000000..25a21bb0adc2726f +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-double.c +@@ -0,0 +1,22 @@ ++/* Test for formatted 'vasprintf' output for double conversions. ++ Copyright (C) 2024 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 ++ . */ ++ ++#define TIMEOUT (DEFAULT_TIMEOUT * 32) ++ ++#include "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-vas-int.c b/stdio-common/tst-printf-format-vas-int.c +new file mode 100644 +index 0000000000000000..9cd70c8fcbae1c03 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-vas-ldouble.c b/stdio-common/tst-printf-format-vas-ldouble.c +new file mode 100644 +index 0000000000000000..60c3933fab1b9216 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-ldouble.c +@@ -0,0 +1,22 @@ ++/* Test for formatted 'vasprintf' output for long double conversions. ++ Copyright (C) 2024 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 ++ . */ ++ ++#define TIMEOUT (DEFAULT_TIMEOUT * 128) ++ ++#include "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-vas-llong.c b/stdio-common/tst-printf-format-vas-llong.c +new file mode 100644 +index 0000000000000000..5d5322b8b9dfe0a4 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-vas-long.c b/stdio-common/tst-printf-format-vas-long.c +new file mode 100644 +index 0000000000000000..d9651053f8f14dcd +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-vas-s.c b/stdio-common/tst-printf-format-vas-s.c +new file mode 100644 +index 0000000000000000..6d74ab83e3038b44 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-vas-short.c b/stdio-common/tst-printf-format-vas-short.c +new file mode 100644 +index 0000000000000000..a6d76a97055fbb89 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-vas-uchar.c b/stdio-common/tst-printf-format-vas-uchar.c +new file mode 100644 +index 0000000000000000..c3dee11b7d8092d9 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-vas-uint.c b/stdio-common/tst-printf-format-vas-uint.c +new file mode 100644 +index 0000000000000000..e56e89374db69c3f +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-vas-ullong.c b/stdio-common/tst-printf-format-vas-ullong.c +new file mode 100644 +index 0000000000000000..05691bc3181c6d18 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-vas-ulong.c b/stdio-common/tst-printf-format-vas-ulong.c +new file mode 100644 +index 0000000000000000..767d9cb6a6ac64a2 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-vas-ushort.c b/stdio-common/tst-printf-format-vas-ushort.c +new file mode 100644 +index 0000000000000000..284d79f75364504f +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vasprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vas.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-vas.h b/stdio-common/tst-printf-format-vas.h +new file mode 100644 +index 0000000000000000..3e38e729ec97ceed +--- /dev/null ++++ b/stdio-common/tst-printf-format-vas.h +@@ -0,0 +1,50 @@ ++/* Test feature wrapper for formatted 'vasprintf' output. ++ Copyright (C) 2024 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 ++#include ++ ++static int ++printf_under_test (const char *restrict fmt, ...) ++{ ++ va_list ap; ++ int result; ++ char *str; ++ ++ va_start (ap, fmt); ++ result = vasprintf (&str, fmt, ap); ++ va_end (ap); ++ if (result < 0) ++ { ++ perror ("vasprintf"); ++ goto out; ++ } ++ if (fwrite (str, sizeof (*str), result, stdout) != result) ++ { ++ perror ("fwrite"); ++ result = -1; ++ } ++ free (str); ++out: ++ return result; ++} ++ ++#ifndef TIMEOUT ++# define TIMEOUT (DEFAULT_TIMEOUT * 12) ++#endif diff --git a/glibc-RHEL-46725-9.patch b/glibc-RHEL-46725-9.patch new file mode 100644 index 0000000..14f90da --- /dev/null +++ b/glibc-RHEL-46725-9.patch @@ -0,0 +1,456 @@ +commit fae4eacae75e4f2767998aca703d6efaae2a747f +Author: Maciej W. Rozycki +Date: Thu Nov 7 06:14:24 2024 +0000 + + stdio-common: Add tests for formatted vdprintf output specifiers + + Wire vdprintf into test infrastructure for formatted printf output + specifiers. + + Reviewed-by: DJ Delorie + +diff --git a/stdio-common/Makefile b/stdio-common/Makefile +index 2675d7741fe496d4..437acef216b04237 100644 +--- a/stdio-common/Makefile ++++ b/stdio-common/Makefile +@@ -23,7 +23,7 @@ subdir := stdio-common + include ../Makeconfig + + # List of markers for printf family function tests. +-xprintf-funcs := p as d f s sn v vas ++xprintf-funcs := p as d f s sn v vas vd + + # List of data types and formats for individual per-conversion printf tests. + fmt-convs := double ldouble +diff --git a/stdio-common/tst-printf-format-vd-c.c b/stdio-common/tst-printf-format-vd-c.c +new file mode 100644 +index 0000000000000000..209b1784896a0bfd +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-c.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for the 'c' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-c.c" +diff --git a/stdio-common/tst-printf-format-vd-char.c b/stdio-common/tst-printf-format-vd-char.c +new file mode 100644 +index 0000000000000000..8286b6d5b227e83a +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-char.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for signed char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-char.c" +diff --git a/stdio-common/tst-printf-format-vd-double.c b/stdio-common/tst-printf-format-vd-double.c +new file mode 100644 +index 0000000000000000..e89a2ca5983697ce +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-double.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-double.c" +diff --git a/stdio-common/tst-printf-format-vd-int.c b/stdio-common/tst-printf-format-vd-int.c +new file mode 100644 +index 0000000000000000..598a888b1c937361 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-int.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-int.c" +diff --git a/stdio-common/tst-printf-format-vd-ldouble.c b/stdio-common/tst-printf-format-vd-ldouble.c +new file mode 100644 +index 0000000000000000..d3ada6ff0bcdd9c1 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-ldouble.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for long double conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-ldouble.c" +diff --git a/stdio-common/tst-printf-format-vd-llong.c b/stdio-common/tst-printf-format-vd-llong.c +new file mode 100644 +index 0000000000000000..ea6ea7b2157dc0c9 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-llong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-llong.c" +diff --git a/stdio-common/tst-printf-format-vd-long.c b/stdio-common/tst-printf-format-vd-long.c +new file mode 100644 +index 0000000000000000..4ee1cdacffb4fe77 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-long.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-long.c" +diff --git a/stdio-common/tst-printf-format-vd-s.c b/stdio-common/tst-printf-format-vd-s.c +new file mode 100644 +index 0000000000000000..df7cf9a6fbf04c9b +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-s.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for the 's' conversion. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-s.c" +diff --git a/stdio-common/tst-printf-format-vd-short.c b/stdio-common/tst-printf-format-vd-short.c +new file mode 100644 +index 0000000000000000..87128c8303b57cd8 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-short.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-short.c" +diff --git a/stdio-common/tst-printf-format-vd-uchar.c b/stdio-common/tst-printf-format-vd-uchar.c +new file mode 100644 +index 0000000000000000..90dea719471dcb30 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-uchar.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for unsigned char conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-uchar.c" +diff --git a/stdio-common/tst-printf-format-vd-uint.c b/stdio-common/tst-printf-format-vd-uint.c +new file mode 100644 +index 0000000000000000..feb95dc018ee20fe +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-uint.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for unsigned int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-uint.c" +diff --git a/stdio-common/tst-printf-format-vd-ullong.c b/stdio-common/tst-printf-format-vd-ullong.c +new file mode 100644 +index 0000000000000000..8f62fb0aeeaca3a3 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-ullong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for unsigned long long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-ullong.c" +diff --git a/stdio-common/tst-printf-format-vd-ulong.c b/stdio-common/tst-printf-format-vd-ulong.c +new file mode 100644 +index 0000000000000000..59b2015cd33aaede +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-ulong.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for unsigned long int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-ulong.c" +diff --git a/stdio-common/tst-printf-format-vd-ushort.c b/stdio-common/tst-printf-format-vd-ushort.c +new file mode 100644 +index 0000000000000000..5d096502d9f44959 +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd-ushort.c +@@ -0,0 +1,20 @@ ++/* Test for formatted 'vdprintf' output for unsigned short int conversions. ++ Copyright (C) 2024 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 "tst-printf-format-vd.h" ++#include "tst-printf-format-skeleton-ushort.c" +diff --git a/stdio-common/tst-printf-format-vd.h b/stdio-common/tst-printf-format-vd.h +new file mode 100644 +index 0000000000000000..d721edadc6f7786b +--- /dev/null ++++ b/stdio-common/tst-printf-format-vd.h +@@ -0,0 +1,62 @@ ++/* Test feature wrapper for formatted 'vdprintf' output. ++ Copyright (C) 2024 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 ++#include ++#include ++ ++/* We need to go through the POSIX-mandated dance to switch between ++ handles on an open file description. */ ++ ++static int ++printf_under_test (const char *restrict fmt, ...) ++{ ++ va_list ap; ++ int result; ++ ++ result = fflush (stdout); ++ if (result == EOF) ++ { ++ perror ("fflush"); ++ goto out; ++ } ++ result = lseek (STDOUT_FILENO, 0, SEEK_END); ++ if (result < 0 && errno == ESPIPE) ++ result = 0; ++ if (result < 0) ++ { ++ perror ("lseek"); ++ goto out; ++ } ++ va_start (ap, fmt); ++ result = vdprintf (STDOUT_FILENO, fmt, ap); ++ va_end (ap); ++ if (result < 0) ++ { ++ perror ("vdprintf"); ++ goto out; ++ } ++ result = fseek (stdout, 0, SEEK_END); ++ if (result < 0 && errno == ESPIPE) ++ result = 0; ++ if (result < 0) ++ perror ("fseek"); ++out: ++ return result; ++} diff --git a/glibc.spec b/glibc.spec index ca3dfa9..d04a059 100644 --- a/glibc.spec +++ b/glibc.spec @@ -157,7 +157,7 @@ end \ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 141%{?dist} +Release: 142%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -931,6 +931,18 @@ Patch692: glibc-RHEL-46736-11.patch Patch693: glibc-RHEL-50548-1.patch Patch694: glibc-RHEL-50548-2.patch Patch695: glibc-RHEL-50548-3.patch +Patch696: glibc-RHEL-46725-1.patch +Patch697: glibc-RHEL-46725-2.patch +Patch698: glibc-RHEL-46725-3.patch +Patch699: glibc-RHEL-46725-4.patch +Patch700: glibc-RHEL-46725-5.patch +Patch701: glibc-RHEL-46725-6.patch +Patch702: glibc-RHEL-46725-7.patch +Patch703: glibc-RHEL-46725-8.patch +Patch704: glibc-RHEL-46725-9.patch +Patch705: glibc-RHEL-46725-10.patch +Patch706: glibc-RHEL-46725-11.patch +Patch707: glibc-RHEL-46725-12.patch ############################################################################## # Continued list of core "glibc" package information: @@ -3090,6 +3102,9 @@ update_gconv_modules_cache () %endif %changelog +* Mon Nov 18 2024 Florian Weimer - 2.34-142 +- Add printf function family tests (RHEL-46725) + * Mon Nov 11 2024 Arjun Shankar - 2.34-141 - Add error and FUSE based tests for fchmod (RHEL-50548)