Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolved unhandled exception when posting commands to web console containing %s #250

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions sonoff/settings.ino
Original file line number Diff line number Diff line change
Expand Up @@ -702,13 +702,12 @@ void CFG_Delta()
sysCfg.blinkcount = APP_BLINKCOUNT;
}
if (sysCfg.version < 0x03011000) { // 3.1.16 - Add parameter
getClient(sysCfg.friendlyname[0], sysCfg.mqtt_client, sizeof(sysCfg.friendlyname[0]));
snprintf_P(sysCfg.friendlyname[0], sizeof(sysCfg.friendlyname[0]), sysCfg.mqtt_client, ESP.getChipId());
}
if (sysCfg.version < 0x03020400) { // 3.2.4 - Add parameter
CFG_DefaultSet_3_2_4();
}
if (sysCfg.version < 0x03020500) { // 3.2.5 - Add parameter
getClient(sysCfg.friendlyname[0], sysCfg.mqtt_client, sizeof(sysCfg.friendlyname[0]));
strlcpy(sysCfg.friendlyname[1], FRIENDLY_NAME"2", sizeof(sysCfg.friendlyname[1]));
strlcpy(sysCfg.friendlyname[2], FRIENDLY_NAME"3", sizeof(sysCfg.friendlyname[2]));
strlcpy(sysCfg.friendlyname[3], FRIENDLY_NAME"4", sizeof(sysCfg.friendlyname[3]));
Expand Down
37 changes: 3 additions & 34 deletions sonoff/sonoff.ino
Original file line number Diff line number Diff line change
Expand Up @@ -293,31 +293,6 @@ uint8_t pwm_idxoffset = 0; // Allowed PWM command offset (change for
boolean mDNSbegun = false;

/********************************************************************************************/

void getClient(char* output, const char* input, byte size)
{
char *token;
uint8_t digits = 0;

if (strstr(input, "%")) {
strlcpy(output, input, size);
token = strtok(output, "%");
if (strstr(input, "%") == input) {
output[0] = '\0';
} else {
token = strtok(NULL, "");
}
if (token != NULL) {
digits = atoi(token);
if (digits) {
snprintf_P(output, size, PSTR("%s%c0%dX"), output, '%', digits);
snprintf_P(output, size, output, ESP.getChipId());
}
}
}
if (!digits) strlcpy(output, input, size);
}

void setLatchingRelay(uint8_t power, uint8_t state)
{
power &= 1;
Expand Down Expand Up @@ -1077,7 +1052,6 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len)
else if (!grpflg && !strcmp(type,"HOSTNAME")) {
if ((data_len > 0) && (data_len < sizeof(sysCfg.hostname))) {
strlcpy(sysCfg.hostname, (payload == 1) ? WIFI_HOSTNAME : dataBuf, sizeof(sysCfg.hostname));
if (strstr(sysCfg.hostname,"%")) strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname));
restartflag = 2;
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"Hostname\":\"%s\"}"), sysCfg.hostname);
Expand Down Expand Up @@ -2158,16 +2132,11 @@ void setup()
Serial.println();
}

if (strstr(sysCfg.hostname, "%")) {
strlcpy(sysCfg.hostname, WIFI_HOSTNAME, sizeof(sysCfg.hostname));
snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname, sysCfg.mqtt_topic, ESP.getChipId() & 0x1FFF);
} else {
snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname);
}
snprintf_P(Hostname, sizeof(Hostname)-1, sysCfg.hostname, sysCfg.mqtt_topic, ESP.getChipId());
snprintf_P(MQTTClient, sizeof(MQTTClient), sysCfg.mqtt_client, ESP.getChipId());

WIFI_Connect();

getClient(MQTTClient, sysCfg.mqtt_client, sizeof(MQTTClient));

if (sysCfg.module == MOTOR) sysCfg.poweronstate = 1; // Needs always on else in limbo!
if (ESP.getResetReason() == "Power on") {
if (sysCfg.poweronstate == 0) { // All off
Expand Down
2 changes: 2 additions & 0 deletions sonoff/user_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
#define WIFI_CONFIG_TOOL WIFI_WPSCONFIG // [WifiConfig] Default tool if wifi fails to connect
// (WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY)

#define WIFI_HOSTNAME "%s-%06X" // Expands to <MQTT_TOPIC>-<last 6 characters of MAC address>

// -- Syslog --------------------------------------
#define SYS_LOG_HOST "domus1" // [LogHost] (Linux) syslog host
#define SYS_LOG_PORT 514 // [LogPort] default syslog UDP port
Expand Down
12 changes: 5 additions & 7 deletions sonoff/webserver.ino
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"t=document.getElementById('t1');"
"if(p==1){"
"c=document.getElementById('c1');"
"o='&c1='+c.value;"
"o='&c1='+encodeURI(c.value);"
"c.value='';"
"t.scrollTop=sn;"
"}"
Expand Down Expand Up @@ -685,9 +685,7 @@ void handleMqtt()
String page = FPSTR(HTTP_HEAD);
page.replace("{v}", "Configure MQTT");
page += FPSTR(HTTP_FORM_MQTT);
char str[sizeof(sysCfg.mqtt_client)];
getClient(str, MQTT_CLIENT_ID, sizeof(sysCfg.mqtt_client));
page.replace("{m0}", str);
page.replace("{m0}", MQTTClient);
page.replace("{m1}", sysCfg.mqtt_host);
page.replace("{m2}", String(sysCfg.mqtt_port));
page.replace("{m3}", sysCfg.mqtt_client);
Expand Down Expand Up @@ -1152,7 +1150,7 @@ void handleCmnd()
if (valid) {
byte curridx = logidx;
if (strlen(webServer->arg("cmnd").c_str())) {
snprintf_P(svalue, sizeof(svalue), webServer->arg("cmnd").c_str());
snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("cmnd").c_str());
byte syslog_now = syslog_level;
syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT
do_cmnd(svalue);
Expand All @@ -1174,7 +1172,7 @@ void handleCmnd()
}
}
counter++;
if (counter > MAX_LOG_LINES -1) counter = 0;
if (counter > MAX_LOG_LINES -1) counter = 0;
} while (counter != logidx);
} else {
message = F("Enable weblog 2 if response expected\n");
Expand Down Expand Up @@ -1211,7 +1209,7 @@ void handleAjax()
byte cflg = 1, counter = 99;

if (strlen(webServer->arg("c1").c_str())) {
snprintf_P(svalue, sizeof(svalue), webServer->arg("c1").c_str());
snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("c1").c_str());
snprintf_P(log, sizeof(log), PSTR("CMND: %s"), svalue);
addLog(LOG_LEVEL_INFO, log);
byte syslog_now = syslog_level;
Expand Down