projects
/
fw
/
openocd
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
etm: prevent segfault when reading bogus information
[fw/openocd]
/
src
/
target
/
etm.c
diff --git
a/src/target/etm.c
b/src/target/etm.c
index e99c24ffbec36f1bdf8e64f1665ae7ac8b6f0c84..be5dd020a28349908857bf2146e8786617724fbf 100644
(file)
--- 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),
ADDR_COMPARATOR(14),
ADDR_COMPARATOR(15),
ADDR_COMPARATOR(16),
+ { 0, 0, 0, 0, NULL }
#undef ADDR_COMPARATOR
};
#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),
DATA_COMPARATOR(6),
DATA_COMPARATOR(7),
DATA_COMPARATOR(8),
+ { 0, 0, 0, 0, NULL }
#undef DATA_COMPARATOR
};
#undef DATA_COMPARATOR
};
@@
-179,6
+181,7
@@
static const struct etm_reg_info etm_counters[] = {
ETM_COUNTER(2),
ETM_COUNTER(3),
ETM_COUNTER(4),
ETM_COUNTER(2),
ETM_COUNTER(3),
ETM_COUNTER(4),
+ { 0, 0, 0, 0, NULL }
#undef ETM_COUNTER
};
#undef ETM_COUNTER
};
@@
-206,6
+209,7
@@
static const struct etm_reg_info etm_outputs[] = {
ETM_OUTPUT(2),
ETM_OUTPUT(3),
ETM_OUTPUT(4),
ETM_OUTPUT(2),
ETM_OUTPUT(3),
ETM_OUTPUT(4),
+ { 0, 0, 0, 0, NULL }
#undef ETM_OUTPUT
};
#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++) {
* 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)
/* this ETM may be too old to have some registers */
if (r->bcd_vers > bcd_vers)