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

David Laight David.Laight at ACULAB.COM
Fri Nov 8 22:29:12 UTC 2024


From: Peter Kästle
> Sent: 08 November 2024 18:12
> 
> On 08.11.24 15:38, David Laight wrote:
> > From: Peter Kaestle
> >> Sent: 08 November 2024 14:02
> >>
> >> 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.
> >
> > I'd suggest getting rid of move_from_unaligned16/32() and replacing
> > with something that just returns the value.
> > Then the clauses are just:
> >          case 2:
> >                  value = read_unaligned_u16(bp);
> >                  break;
> > and nothing will go wrong.
> 
> Good idea, but unfortunately after "git grepping" busybox repo, it seems
> these kind of functions are not defined anywhere.
> All I can find is those "move_from_unaligned*" functions defined inside
> include/platform.h.  And some "get_unaligned_be32/get_unaligned_le32",
> which are obviously not endian-safe.
> 
> Could you please help me understand, where you think those functions
> should come from?
...

You might need to write them :-)

But something like:
	((struct { unsigned short x __attribute__((packed)); } *)bp)->x
might DTRT.

	David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)


More information about the busybox mailing list