diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-05-26 14:10:38 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-05-26 14:10:38 +0200 |
commit | 34751d8bf921a2c07cf9a7ce9074756a3d936013 (patch) | |
tree | e6b0c16dd295ba68436aa130d2eec3366a222256 /libbb/dump.c | |
parent | 8fab21114122c9abf54a750523a12bf263d5b0b2 (diff) | |
download | busybox-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.c | 37 |
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 | /* |