]> git.feebdaed.xyz Git - 0xmirror/radare2.git/commitdiff
Fix scr.color.regs when scr.color.ops is false ##disasm
authorpancake <pancake@nowsecure.com>
Fri, 19 Dec 2025 23:04:10 +0000 (00:04 +0100)
committerGitHub <noreply@github.com>
Fri, 19 Dec 2025 23:04:10 +0000 (00:04 +0100)
libr/anal/dwarf_process.c
libr/core/disasm.c
test/db/anal/x86_16

index ad2183e67a9ec7f632387362d297e9ec7fa5850a..a814e1d23bf6e9f75f1a1c869f0cf24e8c5d4f81 100644 (file)
@@ -510,6 +510,10 @@ static RAnalEnumCase *parse_enumerator(Context *ctx, ut64 idx, RAnalEnumCase *re
                }
        }
 
+       if (!name) {
+               goto cleanup;
+       }
+
        if (result->name != name) {
                result->name = strdup (name);
        }
index 05c8fe4f03864429049a93b275a62311dff7d34c..ff44c2d89de4db938182e5bf4b631f66f6c96856 100644 (file)
@@ -1064,22 +1064,30 @@ static char *colorize_asm_string(RCore *core, RDisasmState *ds, bool print_color
        if (!ds->asm_meta && *source == '.') {
                return strdup (source);
        }
-       if (!ds->show_color || !ds->colorop) {
+       if (!ds->show_color) {
+               return strdup (source);
+       }
+       // When scr.color.ops is false, only colorize if scr.color.regs is enabled
+       bool colorize_regs = r_config_get_b (core->config, "scr.color.regs");
+       if (!ds->colorop && !colorize_regs) {
                return strdup (source);
        }
 
-       if (print_color) {
+       if (print_color && ds->colorop) {
                r_cons_print (core->cons, r_print_color_op_type (core->print, ds->analop.type));
        }
+       // When scr.color.ops is false, use input color for ops but still allow register rainbow coloring
+       const char *color_reg = ds->colorop ? ds->color_reg : core->cons->context->pal.input;
+       const char *color_num = ds->colorop ? ds->color_num : core->cons->context->pal.input;
        // workaround dummy colorizer in case of paired commands (tms320 & friends)
        char *spacer = strstr (source, "||");
        if (spacer) {
                char *scol1, *s1 = r_str_ndup (source, spacer - source);
                char *scol2, *s2 = strdup (spacer + 2);
 
-               scol1 = r_print_colorize_opcode (ds->core->print, s1, ds->color_reg, ds->color_num, partial_reset, f ? f->addr : 0);
+               scol1 = r_print_colorize_opcode (ds->core->print, s1, color_reg, color_num, partial_reset, f ? f->addr : 0);
                free (s1);
-               scol2 = r_print_colorize_opcode (ds->core->print, s2, ds->color_reg, ds->color_num, partial_reset, f ? f->addr : 0);
+               scol2 = r_print_colorize_opcode (ds->core->print, s2, color_reg, color_num, partial_reset, f ? f->addr : 0);
                free (s2);
                if (!scol1) {
                        scol1 = strdup ("");
@@ -1092,7 +1100,7 @@ static char *colorize_asm_string(RCore *core, RDisasmState *ds, bool print_color
                free (scol2);
                return source;
        }
-       return r_print_colorize_opcode (ds->core->print, source, ds->color_reg, ds->color_num, partial_reset, f ? f->addr : 0);
+       return r_print_colorize_opcode (ds->core->print, source, color_reg, color_num, partial_reset, f ? f->addr : 0);
 }
 
 static bool ds_must_strip(RDisasmState *ds) {
@@ -4127,7 +4135,7 @@ static void ds_print_bytes(RDisasmState *ds) {
                                pad[0] = 0;
                        }
                        free (str);
-                       if (ds->show_color_bytes && !ds->show_bytes_ascmt) {
+                       if (ds->show_color && ds->show_color_bytes && !ds->show_bytes_ascmt) {
                                str = r_str_newf ("%s"Color_RESET, nstr);
                                R_FREE (nstr);
                        } else {
index afa0212e30ca47e12e8bbea957839751bf1139c4..44d4c0bd9f96a5b3ea5aa6159c7389292e9eabbb 100644 (file)
@@ -234,7 +234,7 @@ FILE=malloc://2048
 CMDS=<<EOF
 e asm.arch=x86
 e asm.bits=16
-e asm.segmen.bits=8
+e asm.addr.segment.bits=8
 s 0x400
 wx 9090558bec9a000004005dc3
 pd 1 @ 0x405