From 9ed8e7c254591b6f78ce7efa1c79eb1c4b99ac92 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 24 Apr 2020 17:39:26 +0200 Subject: [PATCH] Fix internal array size checks --- tasmota/settings.ino | 4 ++-- tasmota/support.ino | 19 ++++++++++++++----- tasmota/support_command.ino | 10 +++++----- tasmota/support_tasmota.ino | 8 ++++---- tasmota/tasmota.ino | 2 +- tasmota/xdrv_01_webserver.ino | 10 +++++----- tasmota/xdrv_16_tuyamcu.ino | 2 +- 7 files changed, 32 insertions(+), 23 deletions(-) diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 6c299ff06..6ebdf9977 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -741,7 +741,7 @@ void SettingsDefaultSet2(void) Settings.interlock[0] = 0xFF; // Legacy support using all relays in one interlock group Settings.module = MODULE; ModuleDefault(WEMOS); -// for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { Settings.my_gp.io[i] = GPIO_NONE; } +// for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { Settings.my_gp.io[i] = GPIO_NONE; } SettingsUpdateText(SET_FRIENDLYNAME1, FRIENDLY_NAME); SettingsUpdateText(SET_FRIENDLYNAME2, FRIENDLY_NAME"2"); SettingsUpdateText(SET_FRIENDLYNAME3, FRIENDLY_NAME"3"); @@ -1098,7 +1098,7 @@ void SettingsDelta(void) Settings.switchmode[i] = SWITCH_MODE; } } - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { if (Settings.my_gp.io[i] >= GPIO_SWT5) { // Move up from GPIO_SWT5 to GPIO_KEY1 Settings.my_gp.io[i] += 4; } diff --git a/tasmota/support.ino b/tasmota/support.ino index 403f9f062..96b2b533b 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1120,10 +1120,15 @@ String ModuleName(void) void ModuleGpios(myio *gp) { +//#ifdef ESP8266 uint8_t *dest = (uint8_t *)gp; - memset(dest, GPIO_NONE, sizeof(myio)); + uint8_t src[sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0])]; +//#else +// uint16_t *dest = (uint16_t *)gp; +// uint16_t src[sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0])]; +//#endif - uint8_t src[sizeof(mycfgio)]; + memset(dest, GPIO_NONE, sizeof(myio)); if (USER_MODULE == Settings.module) { memcpy(&src, &Settings.user_template.gp, sizeof(mycfgio)); } else { @@ -1138,7 +1143,7 @@ void ModuleGpios(myio *gp) // AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t *)&src, sizeof(mycfgio)); uint32_t j = 0; - for (uint32_t i = 0; i < sizeof(mycfgio); i++) { + for (uint32_t i = 0; i < sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0]); i++) { if (6 == i) { j = 9; } if (8 == i) { j = 12; } dest[j] = src[i]; @@ -1226,7 +1231,11 @@ bool ValidAdc(void) return (ADC0_USER == template_adc0); } +//#ifdef ESP8266 bool GetUsedInModule(uint32_t val, uint8_t *arr) +//#else +//bool GetUsedInModule(uint32_t val, uint16_t *arr) +//#endif { int offset = 0; @@ -1307,7 +1316,7 @@ bool JsonTemplate(const char* dataBuf) SettingsUpdateText(SET_TEMPLATE_NAME, name); } if (obj[D_JSON_GPIO].success()) { - for (uint32_t i = 0; i < sizeof(mycfgio); i++) { + for (uint32_t i = 0; i < sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0]); i++) { Settings.user_template.gp.io[i] = obj[D_JSON_GPIO][i] | 0; } } @@ -1326,7 +1335,7 @@ bool JsonTemplate(const char* dataBuf) void TemplateJson(void) { Response_P(PSTR("{\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), SettingsText(SET_TEMPLATE_NAME)); - for (uint32_t i = 0; i < sizeof(Settings.user_template.gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0]); i++) { ResponseAppend_P(PSTR("%s%d"), (i>0)?",":"", Settings.user_template.gp.io[i]); } ResponseAppend_P(PSTR("],\"" D_JSON_FLAG "\":%d,\"" D_JSON_BASE "\":%d}"), Settings.user_template.flag, Settings.user_template_base +1); diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 3bb271f3a..a60a57b4c 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -1000,7 +1000,7 @@ void CmndModule(void) Settings.module = XdrvMailbox.payload; SetModuleType(); if (Settings.last_module != XdrvMailbox.payload) { - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { Settings.my_gp.io[i] = GPIO_NONE; } } @@ -1036,7 +1036,7 @@ void CmndModules(void) void CmndGpio(void) { - if (XdrvMailbox.index < sizeof(Settings.my_gp)) { + if (XdrvMailbox.index < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0])) { myio cmodule; ModuleGpios(&cmodule); if (ValidGPIO(XdrvMailbox.index, cmodule.io[XdrvMailbox.index]) && (XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < GPIO_SENSOR_END)) { @@ -1046,7 +1046,7 @@ void CmndGpio(void) if (midx == XdrvMailbox.payload) { present = true; } } if (present) { - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { if (ValidGPIO(i, cmodule.io[i]) && (Settings.my_gp.io[i] == XdrvMailbox.payload)) { Settings.my_gp.io[i] = GPIO_NONE; } @@ -1057,7 +1057,7 @@ void CmndGpio(void) } Response_P(PSTR("{")); bool jsflg = false; - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { if (ValidGPIO(i, cmodule.io[i]) || ((GPIO_USER == XdrvMailbox.payload) && !FlashPin(i))) { if (jsflg) { ResponseAppend_P(PSTR(",")); } jsflg = true; @@ -1137,7 +1137,7 @@ void CmndTemplate(void) } SettingsUpdateText(SET_TEMPLATE_NAME, "Merged"); uint32_t j = 0; - for (uint32_t i = 0; i < sizeof(mycfgio); i++) { + for (uint32_t i = 0; i < sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0]); i++) { if (6 == i) { j = 9; } if (8 == i) { j = 12; } if (my_module.io[j] > GPIO_NONE) { diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index d8f33d9a7..0ae1671e7 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1354,7 +1354,7 @@ void GpioInit(void) Settings.serial_config = TS_SERIAL_8N1; } - for (uint32_t i = 0; i < sizeof(Settings.user_template.gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0]); i++) { if ((Settings.user_template.gp.io[i] >= GPIO_SENSOR_END) && (Settings.user_template.gp.io[i] < GPIO_USER)) { Settings.user_template.gp.io[i] = GPIO_USER; // Fix not supported sensor ids in template } @@ -1362,7 +1362,7 @@ void GpioInit(void) myio def_gp; ModuleGpios(&def_gp); - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { if ((Settings.my_gp.io[i] >= GPIO_SENSOR_END) && (Settings.my_gp.io[i] < GPIO_USER)) { Settings.my_gp.io[i] = GPIO_NONE; // Fix not supported sensor ids in module } @@ -1388,7 +1388,7 @@ void GpioInit(void) for (uint32_t i = 0; i < GPIO_MAX; i++) { pin[i] = 99; } - for (uint32_t i = 0; i < sizeof(my_module.io); i++) { + for (uint32_t i = 0; i < sizeof(my_module.io)/sizeof(my_module.io[0]); i++) { mpin = ValidPin(i, my_module.io[i]); DEBUG_CORE_LOG(PSTR("INI: gpio pin %d, mpin %d"), i, mpin); @@ -1465,7 +1465,7 @@ void GpioInit(void) // Set any non-used GPIO to INPUT - Related to resetPins() in support_legacy_cores.ino // Doing it here solves relay toggles at restart. - for (uint32_t i = 0; i < sizeof(my_module.io); i++) { + for (uint32_t i = 0; i < sizeof(my_module.io)/sizeof(my_module.io[0]); i++) { mpin = ValidPin(i, my_module.io[i]); // AddLog_P2(LOG_LEVEL_DEBUG, PSTR("INI: gpio pin %d, mpin %d"), i, mpin); if (((i < 6) || (i > 11)) && (0 == mpin)) { // Skip SPI flash interface diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 7ae7d60bb..b3ba8e4f3 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -260,7 +260,7 @@ void setup(void) Settings.rule_enabled = 0; // Disable all rules } if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET] +3) { // Restarted 5 times - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { Settings.my_gp.io[i] = GPIO_NONE; // Reset user defined GPIO disabling sensors } Settings.my_adc0 = ADC0_NONE; // Reset user defined ADC0 disabling sensors diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index bbdda0834..398e4ec90 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -1466,7 +1466,7 @@ void HandleTemplateConfiguration(void) } WSContentSend_P(PSTR("}1")); // Field separator - for (uint32_t i = 0; i < sizeof(cmodule); i++) { // 17,148,29,149,7,255,255,255,138,255,139,255,255 + for (uint32_t i = 0; i < sizeof(cmodule.io)/sizeof(cmodule.io[0]); i++) { // 17,148,29,149,7,255,255,255,138,255,139,255,255 if (!FlashPin(i)) { WSContentSend_P(PSTR("%s%d"), (i>0)?",":"", cmodule.io[i]); } @@ -1518,7 +1518,7 @@ void TemplateSaveSettings(void) snprintf_P(svalue, sizeof(svalue), PSTR(D_CMND_TEMPLATE " {\"" D_JSON_NAME "\":\"%s\",\"" D_JSON_GPIO "\":["), tmp); uint32_t j = 0; - for (uint32_t i = 0; i < sizeof(Settings.user_template.gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.user_template.gp.io)/sizeof(Settings.user_template.gp.io[0]); i++) { if (6 == i) { j = 9; } if (8 == i) { j = 12; } snprintf_P(webindex, sizeof(webindex), PSTR("g%d"), j); @@ -1604,7 +1604,7 @@ void HandleModuleConfiguration(void) WSContentStart_P(S_CONFIGURE_MODULE); WSContentSend_P(HTTP_SCRIPT_MODULE_TEMPLATE); WSContentSend_P(HTTP_SCRIPT_MODULE1, Settings.module); - for (uint32_t i = 0; i < sizeof(cmodule); i++) { + for (uint32_t i = 0; i < sizeof(cmodule.io)/sizeof(cmodule.io[0]); i++) { if (ValidGPIO(i, cmodule.io[i])) { WSContentSend_P(PSTR("sk(%d,%d);"), my_module.io[i], i); // g0 - g16 } @@ -1612,7 +1612,7 @@ void HandleModuleConfiguration(void) WSContentSend_P(HTTP_SCRIPT_MODULE2, Settings.my_adc0); WSContentSendStyle(); WSContentSend_P(HTTP_FORM_MODULE, AnyModuleName(MODULE).c_str()); - for (uint32_t i = 0; i < sizeof(cmodule); i++) { + for (uint32_t i = 0; i < sizeof(cmodule.io)/sizeof(cmodule.io[0]); i++) { if (ValidGPIO(i, cmodule.io[i])) { snprintf_P(stemp, 3, PINS_WEMOS +i*2); #ifdef ESP8266 @@ -1652,7 +1652,7 @@ void ModuleSaveSettings(void) myio cmodule; ModuleGpios(&cmodule); String gpios = ""; - for (uint32_t i = 0; i < sizeof(cmodule); i++) { + for (uint32_t i = 0; i < sizeof(cmodule.io)/sizeof(cmodule.io[0]); i++) { if (Settings.last_module != new_module) { Settings.my_gp.io[i] = GPIO_NONE; } else { diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 9c1834fb0..9acbc1923 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -569,7 +569,7 @@ void TuyaNormalPowerModePacketProcess(void) uint8_t key1_gpio = Tuya.buffer[7]; bool key1_set = false; bool led1_set = false; - for (uint32_t i = 0; i < sizeof(Settings.my_gp); i++) { + for (uint32_t i = 0; i < sizeof(Settings.my_gp.io)/sizeof(Settings.my_gp.io[0]); i++) { if (Settings.my_gp.io[i] == GPIO_LED1) led1_set = true; else if (Settings.my_gp.io[i] == GPIO_KEY1) key1_set = true; }