Fix behaviour of pb and ensure buffer is always smaller than block.
This commit is contained in:
parent
674cdbc25e
commit
c7dd1a9787
3 changed files with 96 additions and 16 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue