From: Hemanth Kumar M D <[email protected]>

Following ptests were failing on aarch64 after glibc 2.43 upgrade:
  - printf_understands_%s_'"x'_"'y"_"'zTAIL"
  - printf_handles_positive_numbers_for_%f

Backport fix from Debian bug #1128825.

References: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1128825

Signed-off-by: Hemanth Kumar M D <[email protected]>
---
 ...printf-ptest-failure-with-glibc-2.43.patch | 114 ++++++++++++++++++
 meta/recipes-core/busybox/busybox_1.37.0.bb   |   1 +
 2 files changed, 115 insertions(+)
 create mode 100644 
meta/recipes-core/busybox/busybox/0001-busybox-fix-printf-ptest-failure-with-glibc-2.43.patch

diff --git 
a/meta/recipes-core/busybox/busybox/0001-busybox-fix-printf-ptest-failure-with-glibc-2.43.patch
 
b/meta/recipes-core/busybox/busybox/0001-busybox-fix-printf-ptest-failure-with-glibc-2.43.patch
new file mode 100644
index 0000000000..951812532b
--- /dev/null
+++ 
b/meta/recipes-core/busybox/busybox/0001-busybox-fix-printf-ptest-failure-with-glibc-2.43.patch
@@ -0,0 +1,114 @@
+busybox: fix printf ptest failure with glibc 2.43
+
+Following ptests were failing on aarch64 after glibc 2.43 upgrade:
+  - printf_understands_%s_'"x'_"'y"_"'zTAIL"
+  - printf_handles_positive_numbers_for_%f
+
+Backport fix from Debian bug #1128825.
+
+Upstream-Status: Submitted 
[https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=1128825;filename=busybox_glibc-2.43_thp.patch;msg=10]
+
+Signed-off-by: Hemanth Kumar M D <[email protected]>
+
+diff --git a/coreutils/printf.c b/coreutils/printf.c
+index 3cd48cfcc..a5d995ab5 100644
+--- a/coreutils/printf.c
++++ b/coreutils/printf.c
+@@ -191,6 +191,7 @@ static void print_direc(char *format, unsigned fmt_length,
+       double dv;
+       char saved;
+       char *have_prec, *have_width;
++      int saved_errno, ret;
+ 
+       saved = format[fmt_length];
+       format[fmt_length] = '\0';
+@@ -205,22 +206,32 @@ static void print_direc(char *format, unsigned 
fmt_length,
+ 
+       switch (format[fmt_length - 1]) {
+       case 'c':
+-              printf(format, *argument);
++              saved_errno = errno;
++              ret = printf(format, *argument);
++              /* Restore errno if there was no error */
++              if (ret >= 0) {
++                      errno = saved_errno;
++              }
+               break;
+       case 'd':
+       case 'i':
+               llv = my_xstrtoll(skip_whitespace(argument));
+  print_long:
++              saved_errno = errno;
+               if (!have_width) {
+                       if (!have_prec)
+-                              printf(format, llv);
++                              ret = printf(format, llv);
+                       else
+-                              printf(format, precision, llv);
++                              ret = printf(format, precision, llv);
+               } else {
+                       if (!have_prec)
+-                              printf(format, field_width, llv);
++                              ret = printf(format, field_width, llv);
+                       else
+-                              printf(format, field_width, precision, llv);
++                              ret = printf(format, field_width, precision, 
llv);
++              }
++              /* Restore errno if there was no error */
++              if (ret >= 0) {
++                      errno = saved_errno;
+               }
+               break;
+       case 'o':
+@@ -238,16 +249,21 @@ static void print_direc(char *format, unsigned 
fmt_length,
+               } else {
+                       /* Hope compiler will optimize it out by moving call
+                        * instruction after the ifs... */
++                      saved_errno = errno;
+                       if (!have_width) {
+                               if (!have_prec)
+-                                      printf(format, argument, /*unused:*/ 
argument, argument);
++                                      ret = printf(format, argument, 
/*unused:*/ argument, argument);
+                               else
+-                                      printf(format, precision, argument, 
/*unused:*/ argument);
++                                      ret = printf(format, precision, 
argument, /*unused:*/ argument);
+                       } else {
+                               if (!have_prec)
+-                                      printf(format, field_width, argument, 
/*unused:*/ argument);
++                                      ret = printf(format, field_width, 
argument, /*unused:*/ argument);
+                               else
+-                                      printf(format, field_width, precision, 
argument);
++                                      ret = printf(format, field_width, 
precision, argument);
++                      }
++                      /* Restore errno if there was no error */
++                      if (ret >= 0) {
++                              errno = saved_errno;
+                       }
+                       break;
+               }
+@@ -257,16 +273,21 @@ static void print_direc(char *format, unsigned 
fmt_length,
+       case 'g':
+       case 'G':
+               dv = my_xstrtod(argument);
++              saved_errno = errno;
+               if (!have_width) {
+                       if (!have_prec)
+-                              printf(format, dv);
++                              ret = printf(format, dv);
+                       else
+-                              printf(format, precision, dv);
++                              ret = printf(format, precision, dv);
+               } else {
+                       if (!have_prec)
+-                              printf(format, field_width, dv);
++                              ret = printf(format, field_width, dv);
+                       else
+-                              printf(format, field_width, precision, dv);
++                              ret = printf(format, field_width, precision, 
dv);
++              }
++              /* Restore errno if there was no error */
++              if (ret >= 0) {
++                      errno = saved_errno;
+               }
+               break;
+       } /* switch */
diff --git a/meta/recipes-core/busybox/busybox_1.37.0.bb 
b/meta/recipes-core/busybox/busybox_1.37.0.bb
index d3851a27b9..2a38372339 100644
--- a/meta/recipes-core/busybox/busybox_1.37.0.bb
+++ b/meta/recipes-core/busybox/busybox_1.37.0.bb
@@ -59,6 +59,7 @@ SRC_URI = 
"https://busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
            file://CVE-2025-46394-01.patch \
            file://CVE-2025-46394-02.patch \
            file://CVE-2025-60876.patch \
+           file://0001-busybox-fix-printf-ptest-failure-with-glibc-2.43.patch 
\ 
            "
 SRC_URI:append:libc-musl = " file://musl.cfg"
 SRC_URI:append:x86-64 = " file://sha_accel.cfg"
-- 
2.49.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#232994): 
https://lists.openembedded.org/g/openembedded-core/message/232994
Mute This Topic: https://lists.openembedded.org/mt/118281850/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to