aboutsummaryrefslogtreecommitdiff
path: root/libbb/dump.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-05-26 14:10:38 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2023-05-26 14:10:38 +0200
commit34751d8bf921a2c07cf9a7ce9074756a3d936013 (patch)
treee6b0c16dd295ba68436aa130d2eec3366a222256 /libbb/dump.c
parent8fab21114122c9abf54a750523a12bf263d5b0b2 (diff)
downloadbusybox-w32-34751d8bf921a2c07cf9a7ce9074756a3d936013.tar.gz
busybox-w32-34751d8bf921a2c07cf9a7ce9074756a3d936013.tar.bz2
busybox-w32-34751d8bf921a2c07cf9a7ce9074756a3d936013.zip
libbb/dump: correct handling of 1-byte signed int format
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/dump.c')
-rw-r--r--libbb/dump.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/libbb/dump.c b/libbb/dump.c
index dace481c2..49340b5a5 100644
--- a/libbb/dump.c
+++ b/libbb/dump.c
@@ -619,31 +619,31 @@ static NOINLINE void display(priv_dumper_t* dumper)
619 } 619 }
620 case F_INT: { 620 case F_INT: {
621 union { 621 union {
622 uint16_t val16; 622 int16_t ival16;
623 uint32_t val32; 623 int32_t ival32;
624 uint64_t val64; 624 int64_t ival64;
625 } u; 625 } u;
626 int value = *bp; 626 int value = (signed char)*bp;
627 627
628 switch (pr->bcnt) { 628 switch (pr->bcnt) {
629 case 1: 629 case 1:
630 break; 630 break;
631 case 2: 631 case 2:
632 memcpy(&u.val16, bp, 2); 632 move_from_unaligned16(u.ival16, bp);
633 value = u.val16; 633 value = u.ival16;
634 break; 634 break;
635 case 4: 635 case 4:
636 memcpy(&u.val32, bp, 4); 636 move_from_unaligned32(u.ival32, bp);
637 value = u.val32; 637 value = u.ival32;
638 break; 638 break;
639 case 8: 639 case 8:
640 memcpy(&u.val64, bp, 8); 640 move_from_unaligned64(u.ival64, bp);
641//A hack. Users _must_ use %llX formats to not truncate high bits 641//A hack. Users _must_ use %llX formats to not truncate high bits
642 printf(pr->fmt, (long long) u.val64); 642 printf(pr->fmt, (long long)u.ival64);
643 goto skip; 643 goto skip;
644 } 644 }
645 printf(pr->fmt, value); 645 printf(pr->fmt, value);
646 IF_OD(skip:) 646 skip:
647 break; 647 break;
648 } 648 }
649 case F_P: 649 case F_P:
@@ -659,22 +659,19 @@ static NOINLINE void display(priv_dumper_t* dumper)
659 conv_u(pr, bp); 659 conv_u(pr, bp);
660 break; 660 break;
661 case F_UINT: { 661 case F_UINT: {
662 unsigned ival; 662 unsigned value = (unsigned char)*bp;
663 unsigned short sval;
664
665 switch (pr->bcnt) { 663 switch (pr->bcnt) {
666 case 1: 664 case 1:
667 printf(pr->fmt, (unsigned) *bp);
668 break; 665 break;
669 case 2: 666 case 2:
670 memcpy(&sval, bp, sizeof(sval)); 667 move_from_unaligned16(value, bp);
671 printf(pr->fmt, (unsigned) sval);
672 break; 668 break;
673 case 4: 669 case 4:
674 memcpy(&ival, bp, sizeof(ival)); 670 move_from_unaligned32(value, bp);
675 printf(pr->fmt, ival);
676 break; 671 break;
672 /* case 8: no users yet */
677 } 673 }
674 printf(pr->fmt, value);
678 break; 675 break;
679 } 676 }
680 } 677 }
@@ -686,7 +683,7 @@ static NOINLINE void display(priv_dumper_t* dumper)
686 } 683 }
687 } 684 }
688 } 685 }
689 endfu: 686 IF_OD(endfu:)
690 if (dumper->endfu) { 687 if (dumper->endfu) {
691 PR *pr; 688 PR *pr;
692 /* 689 /*