[PATCH] libbb/dump: correct handling of unsigned on big endian

Peter Kaestle peter.kaestle at nokia.com
Fri Nov 8 14:01:54 UTC 2024


The following commit broke dumping unsigned on big endian:
34751d8bf (libbb/dump: correct handling of 1-byte signed int format, 2023-05-26)

Example of the bug:

root at fct:~ >echo -ne "\xfe\xfd\xfc\xfb" > /tmp/testfile

before 34751d8bf:
$>/tmp/busybox_1_36_1 hexdump /tmp/testfile
0000000 fefd fcfb
0000004

with 34751d8bf:
$>busybox_1_37_0 hexdump /tmp/testfile
0000000 fefd00fe fcfb00fc
0000004

Problem originated from loading data into 32-bit "value" variable and
then doing the memcpy of 2 or 4 bytes into value afterwards, without
taking care of the byte order in case of big-endian cpus.

Replicating same solution used in F_INT with the union fixes the issue.

Signed-off-by: Peter Kaestle <peter.kaestle at nokia.com>
---
 libbb/dump.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/libbb/dump.c b/libbb/dump.c
index b406a2428..87180dff5 100644
--- a/libbb/dump.c
+++ b/libbb/dump.c
@@ -665,15 +665,23 @@ static NOINLINE void display(priv_dumper_t* dumper)
 							conv_u(pr, bp);
 							break;
 						case F_UINT: {
+							union {
+								uint16_t val16;
+								uint32_t val32;
+								uint64_t val64;
+							} u;
 							unsigned value = (unsigned char)*bp;
+
 							switch (pr->bcnt) {
 							case 1:
 								break;
 							case 2:
-								move_from_unaligned16(value, bp);
+								move_from_unaligned16(u.val16, bp);
+								value = u.val16;
 								break;
 							case 4:
-								move_from_unaligned32(value, bp);
+								move_from_unaligned32(u.val32, bp);
+								value = u.val32;
 								break;
 							/* case 8: no users yet */
 							}
-- 
2.35.7



More information about the busybox mailing list