Fix behaviour of pb and ensure buffer is always smaller than block.

This commit is contained in:
wargio 2026-07-06 19:36:59 +08:00 committed by Giovanni
parent 674cdbc25e
commit c7dd1a9787
3 changed files with 96 additions and 16 deletions

View file

@ -3511,21 +3511,50 @@ RZ_IPI RzCmdStatus rz_cmd_base64_decode_handler(RzCore *core, int argc, const ch
}
RZ_IPI RzCmdStatus rz_print_bitstream_handler(RzCore *core, int argc, const char **argv, RzOutputMode mode) {
int len = (int)rz_num_math(core->num, argv[1]);
int skip = (int)rz_num_math(core->num, argv[2]);
if (len < 0 || skip < 0) {
RZ_LOG_ERROR("len and skip should be positive numbers\n");
ut64 old_offset = core->offset;
st32 len = (st32)rz_num_math(core->num, argv[1]);
st32 skip = (st32)rz_num_math(core->num, argv[2]);
if (len < 0 || (!len && !skip)) {
RZ_LOG_ERROR("`len` should be a positive number\n");
return RZ_CMD_STATUS_ERROR;
} else if (skip < 0) {
RZ_LOG_ERROR("`skip` should be a positive number\n");
return RZ_CMD_STATUS_ERROR;
}
// `pb len skip` means skip <skip> bits then print <len> bits
char *buf = RZ_NEWS0(char, len + skip + 1);
const size_t skip_n_chars = skip & 7;
const size_t max_n_bits = ((size_t)core->blocksize) << 3;
const size_t buf_len = ((size_t)len) + (skip_n_chars ? 8 : 0);
if (buf_len > max_n_bits) {
RZ_LOG_ERROR("cannot print %" PFMT32d " bits when current block size is %" PFMTSZu " bits\n", len, max_n_bits);
return RZ_CMD_STATUS_ERROR;
}
char *buf = RZ_NEWS0(char, buf_len + 1);
if (!buf) {
RZ_LOG_ERROR("Fail to allocate memory\n");
return RZ_CMD_STATUS_ERROR;
}
rz_str_bits(buf, core->block, len + skip, NULL);
rz_cons_println(buf + skip);
if (skip > 7) {
const size_t n_bytes = (skip >> 3);
rz_core_seek(core, old_offset + n_bytes, true);
}
rz_str_bits(buf, core->block, buf_len, NULL);
if (skip_n_chars) {
// we always show `len` bits, just shifted.
// so we trim the last chars.
buf[buf_len - (8 - skip_n_chars)] = 0;
}
rz_cons_println(buf + skip_n_chars);
free(buf);
if (skip > 7) {
rz_core_seek(core, old_offset, true);
}
return RZ_CMD_STATUS_OK;
}

View file

@ -34,14 +34,6 @@ CMDS=p8 0
EXPECT=
RUN
NAME=pb 0
FILE=bins/elf/analysis/hello-arm32
CMDS=pb 0
EXPECT=<<EOF
EOF
RUN
NAME=pB 0
FILE=bins/elf/analysis/hello-arm32
CMDS=pB 0

View file

@ -9,18 +9,77 @@ EXPECT=<<EOF
EOF
RUN
NAME=pb 0x12
NAME=pb
FILE==
CMDS=<<EOF
wx 0x12
pb 8
pb 4 2
pb 4 3
echo ---
wx 01010f00
echo 0...4...8...c...
echo pb 16 0
pb 16 0
echo pb 16
pb 16
echo pb 16 1
pb 16 1
echo pb 16 2
pb 16 2
echo pb 16 3
pb 16 3
echo pb 16 4
pb 16 4
echo pb 16 5
pb 16 5
echo pb 16 6
pb 16 6
echo pb 16 7
pb 16 7
echo pb 16 8
pb 16 8
echo pb 16 9
pb 16 9
echo pb 16 10
pb 16 10
echo 0...4...8...c...
echo pb 3 9
pb 3 19
EOF
EXPECT=<<EOF
00010010
0100
1001
---
0...4...8...c...
pb 16 0
0000000100000001
pb 16
0000000100000001
pb 16 1
0000001000000010
pb 16 2
0000010000000100
pb 16 3
0000100000001000
pb 16 4
0001000000010000
pb 16 5
0010000000100001
pb 16 6
0100000001000011
pb 16 7
1000000010000111
pb 16 8
0000000100001111
pb 16 9
0000001000011110
pb 16 10
0000010000111100
0...4...8...c...
pb 3 9
011
EOF
RUN