SNTP: configTime server cannot reference temporary char pointer · Issue #7056 · esp8266/Arduino (original) (raw)

Basic Infos

Platform

Settings in IDE

Problem Description

With this piece of code below:

sntp_setservername(id, (char*) name_or_ip);

If user does something like:

const String server = retrieveMyServerSettings(); configTime("UTC0", server.c_str());

Because lwip only stores a pointer
https://git.savannah.nongnu.org/cgit/lwip.git/tree/src/apps/sntp/sntp.c?h=STABLE-2_1_x#n876

void
sntp_setservername(u8_t idx, const char *server)
{
  LWIP_ASSERT_CORE_LOCKED();
  if (idx < SNTP_MAX_SERVERS) {
    sntp_servers[idx].name = server;
  }
}

Pointer becomes garbage after some time.

Library example is not affected

MCVE Sketch

#include <ESP8266WiFi.h> #include <Arduino.h> #include <sntp.h> #include <PolledTimeout.h>

static esp8266::polledTimeout::periodicFastMs poll(1000);

void setup() { Serial.begin(115200); String value("testtesttest"); configTime("UTC0", value.c_str(), "domainname"); Serial.printf("before: 0 -> %s, 1 -> %s\n", sntp_getservername(0), sntp_getservername(1)); WiFi.persistent(false); WiFi.mode(WIFI_STA); WiFi.begin("blah", "blah"); }

void loop() { if (poll) { Serial.printf("1 -> %s\n", sntp_getservername(1)); Serial.flush(); Serial.printf("0 -> %s\n", sntp_getservername(0)); Serial.flush(); } }

Debug Messages

// 2.6.3 even crashes. git manages to stay online

before: testtesttest domainname
1 -> domainname
0 -> ␔��?�:
1 -> domainname
0 -> ␔��?�:
1 -> domainname
0 -> ␔��?�:

Exception (28):
epc1=0x40207c2e epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
...