From 9cd1760fa5209fe938df43fad41302a625161eaf Mon Sep 17 00:00:00 2001 From: Nathan Schulte <8540239+nmschulte@users.noreply.github.com> Date: Mon, 5 Dec 2022 17:41:30 -0600 Subject: [PATCH] firmware: fix ISO date-time parsing (#4872) sscanf(isoDateTime, "%4lu-%2hhu-%2hhuT%2hhu:%2hhu:%2hhu", ...) would not parse beyond the month when built for rusEFI, for unknown reasons, though it works with a simplified test with GCC, hence the splayed parsing use sscanf over atoi for improved memory safety --- firmware/controllers/settings.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index 42a2933ead..a6c72437b1 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -1107,12 +1107,15 @@ void printDateTime() { void setDateTime(const char * const isoDateTime) { #if EFI_RTC - if (strlen(isoDateTime) > 0) { + if (strlen(isoDateTime) >= 19 && isoDateTime[10] == 'T') { efidatetime_t dateTime; - if (sscanf("%04u-%02u-%02uT%02u:%02u:%02u", isoDateTime, - &dateTime.year, &dateTime.month, &dateTime.day, - &dateTime.hour, &dateTime.minute, &dateTime.second) - == 6) { // 6 fields to properly scan + int scanned = sscanf(isoDateTime, "%4lu", &dateTime.year); + scanned += sscanf(isoDateTime + 5, "%2hhu", &dateTime.month); + scanned += sscanf(isoDateTime + 8, "%2hhu", &dateTime.day); + scanned += sscanf(isoDateTime + 11, "%2hhu", &dateTime.hour); + scanned += sscanf(isoDateTime + 14, "%2hhu", &dateTime.minute); + scanned += sscanf(isoDateTime + 17, "%2hhu", &dateTime.second); + if (scanned == 6) { // 6 fields to properly scan setRtcDateTime(&dateTime); return; }