From: Paul Fertser Date: Tue, 16 Jul 2013 07:29:15 +0000 (+0400) Subject: etm: prevent segfault when reading bogus information X-Git-Tag: v0.8.0-rc1~343 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=d1ae39efc02bb67bc637ec92b5f60254c8ac959f;p=openocd etm: prevent segfault when reading bogus information When I do not have the JTAG adapter connected to the target, I often end up always reading 1s from the chain. If the OpenOCD is configured to connect to an ETM-equipped target (i.MX25 ARM9 in my case), this results in writing garbage values in the etm reg_cache as the ETM bit fields for the comparators, counters and outputs are wider than the amount of entries in the corresponding arrays. This later results in a segfault in the first etm_reg_lookup() call. Change-Id: Ied81fdbf3a53a3dd749e2e5e97adf86c012df575 Signed-off-by: Paul Fertser Reviewed-on: http://openocd.zylin.com/1505 Tested-by: jenkins Reviewed-by: Spencer Oliver --- diff --git a/src/target/etm.c b/src/target/etm.c index e99c24ff..be5dd020 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -144,6 +144,7 @@ static const struct etm_reg_info etm_addr_comp[] = { ADDR_COMPARATOR(14), ADDR_COMPARATOR(15), ADDR_COMPARATOR(16), + { 0, 0, 0, 0, NULL } #undef ADDR_COMPARATOR }; @@ -162,6 +163,7 @@ static const struct etm_reg_info etm_data_comp[] = { DATA_COMPARATOR(6), DATA_COMPARATOR(7), DATA_COMPARATOR(8), + { 0, 0, 0, 0, NULL } #undef DATA_COMPARATOR }; @@ -179,6 +181,7 @@ static const struct etm_reg_info etm_counters[] = { ETM_COUNTER(2), ETM_COUNTER(3), ETM_COUNTER(4), + { 0, 0, 0, 0, NULL } #undef ETM_COUNTER }; @@ -206,6 +209,7 @@ static const struct etm_reg_info etm_outputs[] = { ETM_OUTPUT(2), ETM_OUTPUT(3), ETM_OUTPUT(4), + { 0, 0, 0, 0, NULL } #undef ETM_OUTPUT }; @@ -265,6 +269,11 @@ static void etm_reg_add(unsigned bcd_vers, struct arm_jtag *jtag_info, * version of the ETM, to the specified cache. */ for (; nreg--; r++) { + /* No more registers to add */ + if (!r->size) { + LOG_ERROR("etm_reg_add is requested to add non-existing registers, ETM config might be bogus"); + return; + } /* this ETM may be too old to have some registers */ if (r->bcd_vers > bcd_vers)