]> git.sur5r.net Git - openocd/commitdiff
Avoid null target->semihosting references.
authorLiviu Ionescu <ilg@livius.net>
Sun, 15 Jul 2018 06:45:13 +0000 (09:45 +0300)
committerTomas Vanek <vanekt@fbl.cz>
Wed, 18 Jul 2018 20:10:53 +0000 (21:10 +0100)
The new common semihosting code introduced a bug,
in certain conditions target->semihosting was
used without semihosting being initialised.

The solution was to explicitly test for
target->semihosting before dereferencing it.

Change-Id: I4c83e596140c68fe4ab32e586e51f7e981a40798
Signed-off-by: Liviu Ionescu <ilg@livius.net>
Reviewed-on: http://openocd.zylin.com/4603
Tested-by: jenkins
Reviewed-by: Jonathan Larmour <jifl@eCosCentric.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
src/target/arm_semihosting.c
src/target/armv4_5.c
src/target/armv7m.c

index 31ca7792f26248baa45c18e2f40824209908a561..9117a74426b056cbb487c4f1b969578dd5ea0657 100644 (file)
@@ -82,6 +82,9 @@ static int post_result(struct target *target)
 {
        struct arm *arm = target_to_arm(target);
 
+       if (!target->semihosting)
+               return ERROR_FAIL;
+
        /* REVISIT this looks wrong ... ARM11 and Cortex-A8
         * should work this way at least sometimes.
         */
index 5ee8ead66f757ec6d95ad5ec3d710f0fb4a6453d..96a63e497adeb1256fd034555b09a9cdb6c2b967 100644 (file)
@@ -752,7 +752,7 @@ int arm_arch_state(struct target *target)
        }
 
        /* avoid filling log waiting for fileio reply */
-       if (target->semihosting->hit_fileio)
+       if (target->semihosting && target->semihosting->hit_fileio)
                return ERROR_OK;
 
        LOG_USER("target halted in %s state due to %s, current mode: %s\n"
@@ -762,8 +762,8 @@ int arm_arch_state(struct target *target)
                arm_mode_name(arm->core_mode),
                buf_get_u32(arm->cpsr->value, 0, 32),
                buf_get_u32(arm->pc->value, 0, 32),
-               target->semihosting->is_active ? ", semihosting" : "",
-               target->semihosting->is_fileio ? " fileio" : "");
+               (target->semihosting && target->semihosting->is_active) ? ", semihosting" : "",
+               (target->semihosting && target->semihosting->is_fileio) ? " fileio" : "");
 
        return ERROR_OK;
 }
index 1b4e5b154db16fe3af5f0ea134383d8d464b1ea3..7d3bd73674d554e8aa14fd96991418c687a023e6 100644 (file)
@@ -541,7 +541,7 @@ int armv7m_arch_state(struct target *target)
        uint32_t ctrl, sp;
 
        /* avoid filling log waiting for fileio reply */
-       if (target->semihosting->hit_fileio)
+       if (target->semihosting && target->semihosting->hit_fileio)
                return ERROR_OK;
 
        ctrl = buf_get_u32(arm->core_cache->reg_list[ARMV7M_CONTROL].value, 0, 32);
@@ -556,8 +556,8 @@ int armv7m_arch_state(struct target *target)
                buf_get_u32(arm->pc->value, 0, 32),
                (ctrl & 0x02) ? 'p' : 'm',
                sp,
-               target->semihosting->is_active ? ", semihosting" : "",
-               target->semihosting->is_fileio ? " fileio" : "");
+               (target->semihosting && target->semihosting->is_active) ? ", semihosting" : "",
+               (target->semihosting && target->semihosting->is_fileio) ? " fileio" : "");
 
        return ERROR_OK;
 }