aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2018-09-06 22:46:54 +0200
committerKévin Redon <kredon@sysmocom.de>2018-09-06 22:47:01 +0200
commit7d5d011095d9402373bf07611d0ef5a468ace04b (patch)
treef22ecb7696315f5cc6574042d1ff2f60968faed4
parent1dbcf62295cb7932d1e84ee02d27b22746aa1510 (diff)
minor: add checks on configurations and functions
these checks prevent out of bounds access and running unset function pointers. Change-Id: Ida889d40b898fc1ab8b885800431833570fdaafe
-rw-r--r--firmware/apps/cardem/main.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/firmware/apps/cardem/main.c b/firmware/apps/cardem/main.c
index 600e4e9..0b5fbde 100644
--- a/firmware/apps/cardem/main.c
+++ b/firmware/apps/cardem/main.c
@@ -101,7 +101,11 @@ static volatile enum confNum simtrace_config = CFG_NUM_CCID;
void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum)
{
TRACE_INFO_WP("cfgChanged%d ", cfgnum);
- simtrace_config = cfgnum;
+ if (cfgnum < ARRAY_SIZE(config_func_ptrs)) {
+ simtrace_config = cfgnum;
+ } else {
+ TRACE_ERROR("trying to set out of bounds config %u\r\n", cfgnum);
+ }
}
void USART1_IrqHandler(void)
@@ -204,7 +208,9 @@ extern int main(void)
}
TRACE_INFO("calling init of config %u...\n\r", simtrace_config);
- config_func_ptrs[simtrace_config].init();
+ if (config_func_ptrs[simtrace_config].init) {
+ config_func_ptrs[simtrace_config].init();
+ }
last_simtrace_config = simtrace_config;
TRACE_INFO("entering main loop...\n\r");
@@ -232,11 +238,17 @@ extern int main(void)
if (last_simtrace_config != simtrace_config) {
TRACE_INFO("USB config chg %u -> %u\n\r",
last_simtrace_config, simtrace_config);
- config_func_ptrs[last_simtrace_config].exit();
- config_func_ptrs[simtrace_config].init();
+ if (config_func_ptrs[last_simtrace_config].exit) {
+ config_func_ptrs[last_simtrace_config].exit();
+ }
+ if (config_func_ptrs[simtrace_config].init) {
+ config_func_ptrs[simtrace_config].init();
+ }
last_simtrace_config = simtrace_config;
} else {
- config_func_ptrs[simtrace_config].run();
+ if (config_func_ptrs[simtrace_config].run) {
+ config_func_ptrs[simtrace_config].run();
+ }
}
}
}