From 62516d26a3d46efb60d8458765f1218e0a68a7a0 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Tue, 18 Feb 2020 22:20:07 -0500 Subject: [PATCH] Need more truth-checks Signed-off-by: Sara Damiano --- src/TinyGsmClientMC60.h | 5 +++-- src/TinyGsmClientSIM5360.h | 4 ++-- src/TinyGsmClientSIM7000.h | 4 ++-- src/TinyGsmClientSIM7600.h | 4 ++-- src/TinyGsmClientSIM800.h | 4 ++-- src/TinyGsmClientSaraR4.h | 5 +++-- src/TinyGsmClientUBLOX.h | 5 +++-- src/TinyGsmModem.tpp | 7 ++++--- src/TinyGsmTCP.tpp | 2 +- 9 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/TinyGsmClientMC60.h b/src/TinyGsmClientMC60.h index 8314316..45bd290 100644 --- a/src/TinyGsmClientMC60.h +++ b/src/TinyGsmClientMC60.h @@ -519,7 +519,7 @@ class TinyGsmMC60 : public TinyGsmModem, index = 6; goto finish; } else if (data.endsWith( - GF(GSM_NL "+QIRD:"))) { // TODO(?): QIRD? or QIRDI? + GF(GSM_NL "+QIRDI:"))) { // TODO(?): QIRD? or QIRDI? // +QIRDI: ,,,,,< tlen> streamSkipUntil(','); // Skip the context streamSkipUntil(','); // Skip the role @@ -529,7 +529,8 @@ class TinyGsmMC60 : public TinyGsmModem, int8_t num_packets = streamGetIntBefore(','); // read the length of the current packet int16_t len_packet = streamGetIntBefore('\n'); - if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { + if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux] && + num_packets >= 0 && len_packet >= 0) { sockets[mux]->sock_available = len_packet * num_packets; } data = ""; diff --git a/src/TinyGsmClientSIM5360.h b/src/TinyGsmClientSIM5360.h index a53a725..cb6f0f6 100644 --- a/src/TinyGsmClientSIM5360.h +++ b/src/TinyGsmClientSIM5360.h @@ -645,8 +645,8 @@ class TinyGsmSim5360 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore('\n'); if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { - sockets[mux]->got_data = true; - sockets[mux]->sock_available = len; + sockets[mux]->got_data = true; + if (len >= 0 && len <= 1024) { sockets[mux]->sock_available = len; } } data = ""; // DBG("### Got Data:", len, "on", mux); diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index 6bb23ba..3e17b78 100644 --- a/src/TinyGsmClientSIM7000.h +++ b/src/TinyGsmClientSIM7000.h @@ -676,8 +676,8 @@ class TinyGsmSim7000 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore('\n'); if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { - sockets[mux]->got_data = true; - sockets[mux]->sock_available = len; + sockets[mux]->got_data = true; + if (len >= 0 && len <= 1024) { sockets[mux]->sock_available = len; } } data = ""; // DBG("### Got Data:", len, "on", mux); diff --git a/src/TinyGsmClientSIM7600.h b/src/TinyGsmClientSIM7600.h index 75a562d..cd1e722 100644 --- a/src/TinyGsmClientSIM7600.h +++ b/src/TinyGsmClientSIM7600.h @@ -735,8 +735,8 @@ class TinyGsmSim7600 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore('\n'); if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { - sockets[mux]->got_data = true; - sockets[mux]->sock_available = len; + sockets[mux]->got_data = true; + if (len >= 0 && len <= 1024) { sockets[mux]->sock_available = len; } } data = ""; // DBG("### Got Data:", len, "on", mux); diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index df5f3de..0b20ccd 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -651,8 +651,8 @@ class TinyGsmSim800 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore('\n'); if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { - sockets[mux]->got_data = true; - sockets[mux]->sock_available = len; + sockets[mux]->got_data = true; + if (len >= 0 && len <= 1024) { sockets[mux]->sock_available = len; } } data = ""; // DBG("### Got Data:", len, "on", mux); diff --git a/src/TinyGsmClientSaraR4.h b/src/TinyGsmClientSaraR4.h index 601f2a8..0ed1b5d 100644 --- a/src/TinyGsmClientSaraR4.h +++ b/src/TinyGsmClientSaraR4.h @@ -827,8 +827,9 @@ class TinyGsmSaraR4 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore('\n'); if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { - sockets[mux]->got_data = true; - sockets[mux]->sock_available = len; + sockets[mux]->got_data = true; + // max size is 1024 + if (len >= 0 && len <= 1024) { sockets[mux]->sock_available = len; } } data = ""; DBG("### URC Data Received:", len, "on", mux); diff --git a/src/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index c0bd5e3..bc551cf 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -759,8 +759,9 @@ class TinyGsmUBLOX : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore('\n'); if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { - sockets[mux]->got_data = true; - sockets[mux]->sock_available = len; + sockets[mux]->got_data = true; + // max size is 1024 + if (len >= 0 && len <= 1024) { sockets[mux]->sock_available = len; } } data = ""; DBG("### URC Data Received:", len, "on", mux); diff --git a/src/TinyGsmModem.tpp b/src/TinyGsmModem.tpp index ba44779..6f1a722 100644 --- a/src/TinyGsmModem.tpp +++ b/src/TinyGsmModem.tpp @@ -268,10 +268,11 @@ class TinyGsmModem { } inline int16_t streamGetIntBefore(char lastChar) { - char buf[6]; + char buf[7]; size_t bytesRead = thisModem().stream.readBytesUntil( - lastChar, buf, static_cast(6)); - if (bytesRead) { + lastChar, buf, static_cast(7)); + // if we read 7 or more bytes, it's an overflow + if (bytesRead && bytesRead < 7) { buf[bytesRead] = '\0'; int16_t res = atoi(buf); return res; diff --git a/src/TinyGsmTCP.tpp b/src/TinyGsmTCP.tpp index 236d6f9..09b3ed2 100644 --- a/src/TinyGsmTCP.tpp +++ b/src/TinyGsmTCP.tpp @@ -270,7 +270,7 @@ class TinyGsmTCP { inline void dumpModemBuffer(uint32_t maxWaitMs) { #if defined TINY_GSM_BUFFER_READ_AND_CHECK_SIZE || \ defined TINY_GSM_BUFFER_READ_NO_CHECK - TINY_GSM_YIELD(); + TINY_GSM_YIELD(); uint32_t startMillis = millis(); while (sock_available > 0 && (millis() - startMillis < maxWaitMs)) { rx.clear();