This is an automated email from Gerrit.

"Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/7108

-- gerrit

commit b5de26a996b461e0c619522b2643a136634d2ee0
Author: Tomas Vanek <van...@fbl.cz>
Date:   Tue Aug 2 11:33:07 2022 +0200

    target/cortex_m: prevent segmentation fault in cortex_m_poll()
    
    If a Cortex-M MCU become unresponsive during a debug session and
    re-examination fails to find MEM-AP, debug_ap pointer is set to NULL.
    
    Eventual call of cortex_m_poll() dereferences debug_ap.
    
    Check debug_ap validity at the begin of cortex_m_poll().
    
    Change-Id: I9519f48760c91a48a9e5e8c34634d247098cb14a
    Signed-off-by: Tomas Vanek <van...@fbl.cz>

diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 1682f5dec9..9497aa0373 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -868,6 +868,16 @@ static int cortex_m_poll(struct target *target)
        struct cortex_m_common *cortex_m = target_to_cm(target);
        struct armv7m_common *armv7m = &cortex_m->armv7m;
 
+       /* Check if debug_ap is available to prevent segmentation fault.
+        * If the re-examination after an error does not find a MEM-AP
+        * (e.g. the target stopped communicating), debug_ap pointer
+        * can suddenly become NULL.
+        */
+       if (!armv7m->debug_ap) {
+               target->state = TARGET_UNKNOWN;
+               return ERROR_TARGET_NOT_EXAMINED;
+       }
+
        /* Read from Debug Halting Control and Status Register */
        retval = cortex_m_read_dhcsr_atomic_sticky(target);
        if (retval != ERROR_OK) {

-- 

Reply via email to