mirror of
https://github.com/radareorg/radare2.git
synced 2024-11-23 21:29:49 +00:00
Consider endiannes when performing block write operations ##io (#14789)
This commit is contained in:
parent
da079f22ea
commit
a3d9bf170e
@ -106,6 +106,38 @@ R_API bool r_core_dump(RCore *core, const char *file, ut64 addr, ut64 size, int
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool __endian_swap(ut8 *buf, ut32 blocksize, ut8 len) {
|
||||||
|
ut32 i;
|
||||||
|
ut8 tmp;
|
||||||
|
ut16 v16;
|
||||||
|
ut32 v32;
|
||||||
|
ut64 v64;
|
||||||
|
if (len != 8 && len != 4 && len != 2 && len != 1) {
|
||||||
|
eprintf ("Invalid word size. Use 1, 2, 4 or 8\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (len == 1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (i = 0; i < blocksize; i += len) {
|
||||||
|
switch (len) {
|
||||||
|
case 8:
|
||||||
|
v64 = r_read_at_be64 (buf, i);
|
||||||
|
r_write_at_le64 (buf, v64, i);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
v32 = r_read_at_be32 (buf, i);
|
||||||
|
r_write_at_le32 (buf, v32, i);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
v16 = r_read_at_be16 (buf, i);
|
||||||
|
r_write_at_le16 (buf, v16, i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
R_API int r_core_write_op(RCore *core, const char *arg, char op) {
|
R_API int r_core_write_op(RCore *core, const char *arg, char op) {
|
||||||
int i, j, ret = false;
|
int i, j, ret = false;
|
||||||
ut64 len;
|
ut64 len;
|
||||||
@ -227,7 +259,13 @@ R_API int r_core_write_op(RCore *core, const char *arg, char op) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i=j=0; i<core->blocksize; i++) {
|
bool be = r_config_get_i (core->config, "cfg.bigendian");
|
||||||
|
if (!be) {
|
||||||
|
if (!__endian_swap (str, len, len)) {
|
||||||
|
goto beach;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = j = 0; i < core->blocksize; i++) {
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case 'x': buf[i] ^= str[j]; break;
|
case 'x': buf[i] ^= str[j]; break;
|
||||||
case 'a': buf[i] += str[j]; break;
|
case 'a': buf[i] += str[j]; break;
|
||||||
|
Loading…
Reference in New Issue
Block a user