File CVE-2025-1378.patch of Package radare2
From c6c772d2eab692ce7ada5a4227afd50c355ad545 Mon Sep 17 00:00:00 2001
From: pancake <pancake@nopcode.org>
Date: Tue, 11 Feb 2025 15:11:40 +0100
Subject: [PATCH] Fix #23953 - segfault when using `rasm2 -i 6 -E` ##crash
* The behaviour is not the expected
* Requires a refactoring to address it
* At least its not segfaulting now
---
libr/main/rasm2.c | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/libr/main/rasm2.c b/libr/main/rasm2.c
index 5abb489c7c6c3..f4fd98b461e98 100644
--- a/libr/main/rasm2.c
+++ b/libr/main/rasm2.c
@@ -414,6 +414,10 @@ static ut64 pcpos(const char* buf) {
}
static int rasm_disasm(RAsmState *as, ut64 addr, const char *buf, int len, int bits, int bin, int hex) {
+ if (len < 1) {
+ R_LOG_ERROR ("Invalid length");
+ return 0;
+ }
ut8 *data = NULL;
int ret = 0;
st64 clen = 0;
@@ -481,7 +485,7 @@ static int rasm_disasm(RAsmState *as, ut64 addr, const char *buf, int len, int b
len = clen;
}
- if (hex == 2) {
+ if (hex == 2 && len > 0) {
RAnalOp aop = {0};
while (ret < len) {
if (ret == pcaddr) {
@@ -573,10 +577,12 @@ static bool print_label(void *user, const void *k, const void *v) {
}
static bool rasm_asm(RAsmState *as, const char *buf, ut64 offset, ut64 len, int bits, int bin, bool use_spp, bool hexwords) {
- RAsmCode *acode;
int i, j, ret = 0;
+
r_asm_set_pc (as->a, offset);
- if (!(acode = r_asm_rasm_assemble (as->a, buf, use_spp))) {
+
+ RAsmCode *acode = r_asm_rasm_assemble (as->a, buf, use_spp);
+ if (!acode) {
return false;
}
if (acode->len) {
@@ -1055,14 +1061,21 @@ R_API int r_main_rasm2(int argc, const char *argv[]) {
ret = idx;
goto beach;
}
- if (dis) {
+ if (dis == 1 || dis == 2) {
char *usrstr = strdup (opt.argv[opt.ind]);
len = strlen (usrstr);
- if (skip && len > skip) {
+ if (skip > 0 && len > skip) {
skip *= 2;
- memmove (usrstr, usrstr + skip, len - skip);
- len -= skip;
- usrstr[len] = 0;
+ if (skip < len) {
+ memmove (usrstr, usrstr + skip, len - skip);
+ len -= skip;
+ usrstr[len] = 0;
+ } else {
+ R_LOG_ERROR ("Invalid skip value");
+ free (usrstr);
+ len = 0;
+ goto beach;
+ }
}
if (r_str_startswith (usrstr, "0x")) {
memmove (usrstr, usrstr + 2, strlen (usrstr + 2) + 1);