From fb3f8583a37423f97bc1b4216250fc92f72e9919 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Wed, 15 Apr 2020 15:42:55 -0400 Subject: [PATCH] Some more null pointer checks, fix #186 Signed-off-by: Sara Damiano --- src/TinyGsmClientA6.h | 41 ++++++++++++++++++++++---------------- src/TinyGsmClientBG96.h | 3 +++ src/TinyGsmClientESP8266.h | 37 ++++++++++++++++++---------------- src/TinyGsmClientM590.h | 27 +++++++++++++++---------- src/TinyGsmClientM95.h | 3 +++ src/TinyGsmClientMC60.h | 5 ++++- src/TinyGsmClientSIM5360.h | 13 ++++++------ src/TinyGsmClientSIM7000.h | 3 +++ src/TinyGsmClientSIM7600.h | 13 ++++++------ src/TinyGsmClientSIM800.h | 3 +++ src/TinyGsmClientSaraR4.h | 5 ++++- src/TinyGsmClientUBLOX.h | 3 +++ src/TinyGsmTCP.tpp | 1 + 13 files changed, 98 insertions(+), 59 deletions(-) diff --git a/src/TinyGsmClientA6.h b/src/TinyGsmClientA6.h index 4693abb..0983597 100644 --- a/src/TinyGsmClientA6.h +++ b/src/TinyGsmClientA6.h @@ -471,7 +471,7 @@ class TinyGsmA6 : public TinyGsmModem, String r5s(r5); r5s.trim(); DBG("### ..:", r1s, ",", r2s, ",", r3s, ",", r4s, ",", r5s);*/ data.reserve(64); - uint8_t index = 0; + uint8_t index = 0; uint32_t startMillis = millis(); do { TINY_GSM_YIELD(); @@ -501,24 +501,28 @@ class TinyGsmA6 : public TinyGsmModem, index = 5; goto finish; } else if (data.endsWith(GF("+CIPRCV:"))) { - int8_t mux = streamGetIntBefore(','); - int16_t len = streamGetIntBefore(','); + int8_t mux = streamGetIntBefore(','); + int16_t len = streamGetIntBefore(','); int16_t len_orig = len; - if (len > sockets[mux]->rx.free()) { - DBG("### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); - } else { - DBG("### Got: ", len, "->", sockets[mux]->rx.free()); - } - while (len--) { moveCharFromStreamToFifo(mux); } - // TODO(?) Deal with missing characters - if (len_orig > sockets[mux]->available()) { - DBG("### Fewer characters received than expected: ", - sockets[mux]->available(), " vs ", len_orig); + if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { + if (len > sockets[mux]->rx.free()) { + DBG("### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); + } else { + DBG("### Got: ", len, "->", sockets[mux]->rx.free()); + } + while (len--) { + moveCharFromStreamToFifo(mux); + } + // TODO(?) Deal with missing characters + if (len_orig > sockets[mux]->available()) { + DBG("### Fewer characters received than expected: ", + sockets[mux]->available(), " vs ", len_orig); + } } data = ""; } else if (data.endsWith(GF("+TCPCLOSED:"))) { int8_t mux = streamGetIntBefore('\n'); - if (mux >= 0 && mux < TINY_GSM_MUX_COUNT) { + if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { sockets[mux]->sock_connected = false; } data = ""; @@ -529,7 +533,9 @@ class TinyGsmA6 : public TinyGsmModem, finish: if (!index) { data.trim(); - if (data.length()) { DBG("### Unhandled:", data); } + if (data.length()) { + DBG("### Unhandled:", data); + } data = ""; } // data.replace(GSM_NL, "/"); @@ -561,10 +567,11 @@ class TinyGsmA6 : public TinyGsmModem, } public: - Stream& stream; + Stream& stream; + protected: GsmClientA6* sockets[TINY_GSM_MUX_COUNT]; - const char* gsmNL = GSM_NL; + const char* gsmNL = GSM_NL; }; #endif // SRC_TINYGSMCLIENTA6_H_ diff --git a/src/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index 9396d0a..b5c36a0 100644 --- a/src/TinyGsmClientBG96.h +++ b/src/TinyGsmClientBG96.h @@ -522,6 +522,7 @@ class TinyGsmBG96 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+QIRD="), mux, ',', (uint16_t)size); if (waitResponse(GF("+QIRD:")) != 1) { return 0; } int16_t len = streamGetIntBefore('\n'); @@ -534,6 +535,7 @@ class TinyGsmBG96 : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+QIRD="), mux, GF(",0")); size_t result = 0; if (waitResponse(GF("+QIRD:")) == 1) { @@ -675,6 +677,7 @@ class TinyGsmBG96 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientBG96* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientESP8266.h b/src/TinyGsmClientESP8266.h index 35c0f83..9a8687a 100644 --- a/src/TinyGsmClientESP8266.h +++ b/src/TinyGsmClientESP8266.h @@ -315,9 +315,8 @@ class TinyGsmESP8266 : public TinyGsmModem, // if the status is anything but 3, there are no connections open waitResponse(); // Returns an OK after the status for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) { - GsmClientESP8266* sock = sockets[muxNo]; - if (sock) { - sock->sock_connected = false; + if (sockets[muxNo]) { + sockets[muxNo]->sock_connected = false; } } return false; @@ -339,9 +338,8 @@ class TinyGsmESP8266 : public TinyGsmModem, if (has_status == 2) break; // once we get to the ok, stop } for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) { - GsmClientESP8266* sock = sockets[muxNo]; - if (sock) { - sock->sock_connected = verified_connections[muxNo]; + if (sockets[muxNo]) { + sockets[muxNo]->sock_connected = verified_connections[muxNo]; } } return verified_connections[mux]; @@ -391,17 +389,21 @@ class TinyGsmESP8266 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore(':'); int16_t len_orig = len; - if (len > sockets[mux]->rx.free()) { - DBG("### Buffer overflow: ", len, "received vs", - sockets[mux]->rx.free(), "available"); - } else { - // DBG("### Got Data: ", len, "on", mux); - } - while (len--) { moveCharFromStreamToFifo(mux); } - // TODO(SRGDamia1): deal with buffer overflow/missed characters - if (len_orig > sockets[mux]->available()) { - DBG("### Fewer characters received than expected: ", - sockets[mux]->available(), " vs ", len_orig); + if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { + if (len > sockets[mux]->rx.free()) { + DBG("### Buffer overflow: ", len, "received vs", + sockets[mux]->rx.free(), "available"); + } else { + // DBG("### Got Data: ", len, "on", mux); + } + while (len--) { + moveCharFromStreamToFifo(mux); + } + // TODO(SRGDamia1): deal with buffer overflow/missed characters + if (len_orig > sockets[mux]->available()) { + DBG("### Fewer characters received than expected: ", + sockets[mux]->available(), " vs ", len_orig); + } } data = ""; } else if (data.endsWith(GF("CLOSED"))) { @@ -443,6 +445,7 @@ class TinyGsmESP8266 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientESP8266* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientM590.h b/src/TinyGsmClientM590.h index a11caba..8b915ee 100644 --- a/src/TinyGsmClientM590.h +++ b/src/TinyGsmClientM590.h @@ -395,22 +395,26 @@ class TinyGsmM590 : public TinyGsmModem, int8_t mux = streamGetIntBefore(','); int16_t len = streamGetIntBefore(','); int16_t len_orig = len; - if (len > sockets[mux]->rx.free()) { - DBG("### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); - } else { - DBG("### Got: ", len, "->", sockets[mux]->rx.free()); - } - while (len--) { moveCharFromStreamToFifo(mux); } - // TODO(?): Handle lost characters - if (len_orig > sockets[mux]->available()) { - DBG("### Fewer characters received than expected: ", - sockets[mux]->available(), " vs ", len_orig); + if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { + if (len > sockets[mux]->rx.free()) { + DBG("### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); + } else { + DBG("### Got: ", len, "->", sockets[mux]->rx.free()); + } + while (len--) { + moveCharFromStreamToFifo(mux); + } + // TODO(?): Handle lost characters + if (len_orig > sockets[mux]->available()) { + DBG("### Fewer characters received than expected: ", + sockets[mux]->available(), " vs ", len_orig); + } } data = ""; } else if (data.endsWith(GF("+TCPCLOSE:"))) { int8_t mux = streamGetIntBefore(','); streamSkipUntil('\n'); - if (mux >= 0 && mux < TINY_GSM_MUX_COUNT) { + if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { sockets[mux]->sock_connected = false; } data = ""; @@ -454,6 +458,7 @@ class TinyGsmM590 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientM590* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientM95.h b/src/TinyGsmClientM95.h index 341ab01..a0878ab 100644 --- a/src/TinyGsmClientM95.h +++ b/src/TinyGsmClientM95.h @@ -445,6 +445,7 @@ class TinyGsmM95 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; // TODO(?): Does this work???? // AT+QIRD=,,, // id = GPRS context number = 0, set in GPRS connect @@ -482,6 +483,7 @@ class TinyGsmM95 : public TinyGsmModem, } } + // Not possible to check the number of characters remaining in buffer size_t modemGetAvailable(uint8_t) { return 0; } @@ -618,6 +620,7 @@ class TinyGsmM95 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientM95* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientMC60.h b/src/TinyGsmClientMC60.h index b100baa..a71e96a 100644 --- a/src/TinyGsmClientMC60.h +++ b/src/TinyGsmClientMC60.h @@ -405,7 +405,8 @@ class TinyGsmMC60 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { - // TODO(?): Does this work???? + if (!sockets[mux]) return 0; + // TODO(?): Does this even work???? // AT+QIRD=,,, // id = GPRS context number = 0, set in GPRS connect // sc = role in connection = 1, client of connection @@ -441,6 +442,7 @@ class TinyGsmMC60 : public TinyGsmModem, } } + // Not possible to check the number of characters remaining in buffer size_t modemGetAvailable(uint8_t) { return 0; } @@ -590,6 +592,7 @@ class TinyGsmMC60 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientMC60* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientSIM5360.h b/src/TinyGsmClientSIM5360.h index b8e01a8..7ce9b50 100644 --- a/src/TinyGsmClientSIM5360.h +++ b/src/TinyGsmClientSIM5360.h @@ -517,6 +517,7 @@ class TinyGsmSim5360 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; #ifdef TINY_GSM_USE_HEX sendAT(GF("+CIPRXGET=3,"), mux, ',', (uint16_t)size); if (waitResponse(GF("+CIPRXGET:")) != 1) { return 0; } @@ -560,6 +561,7 @@ class TinyGsmSim5360 : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+CIPRXGET=4,"), mux); size_t result = 0; if (waitResponse(GF("+CIPRXGET:")) == 1) { @@ -579,15 +581,13 @@ class TinyGsmSim5360 : public TinyGsmModem, if (waitResponse(GF("+CIPCLOSE:")) != 1) { return false; } for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) { // +CIPCLOSE:,,..., - bool thisMuxState = stream.parseInt(); - // Need to make sure a socket instace for the socket number exists - // before setting its state - GsmClientSim5360* sock = sockets[muxNo]; - if (sock) { - sock->sock_connected = thisMuxState; + bool muxState = stream.parseInt(); + if (sockets[muxNo]) { + sockets[muxNo]->sock_connected = muxState; } } waitResponse(); // Should be an OK at the end + if (!sockets[mux]) return false; return sockets[mux]->sock_connected; } @@ -715,6 +715,7 @@ class TinyGsmSim5360 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientSim5360* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index 0f84725..072f674 100644 --- a/src/TinyGsmClientSIM7000.h +++ b/src/TinyGsmClientSIM7000.h @@ -550,6 +550,7 @@ class TinyGsmSim7000 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; #ifdef TINY_GSM_USE_HEX sendAT(GF("+CIPRXGET=3,"), mux, ',', (uint16_t)size); if (waitResponse(GF("+CIPRXGET:")) != 1) { return 0; } @@ -597,6 +598,7 @@ class TinyGsmSim7000 : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+CIPRXGET=4,"), mux); size_t result = 0; if (waitResponse(GF("+CIPRXGET:")) == 1) { @@ -756,6 +758,7 @@ class TinyGsmSim7000 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientSim7000* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientSIM7600.h b/src/TinyGsmClientSIM7600.h index 2f384de..d2f2c35 100644 --- a/src/TinyGsmClientSIM7600.h +++ b/src/TinyGsmClientSIM7600.h @@ -608,6 +608,7 @@ class TinyGsmSim7600 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; #ifdef TINY_GSM_USE_HEX sendAT(GF("+CIPRXGET=3,"), mux, ',', (uint16_t)size); if (waitResponse(GF("+CIPRXGET:")) != 1) { return 0; } @@ -651,6 +652,7 @@ class TinyGsmSim7600 : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+CIPRXGET=4,"), mux); size_t result = 0; if (waitResponse(GF("+CIPRXGET:")) == 1) { @@ -672,15 +674,13 @@ class TinyGsmSim7600 : public TinyGsmModem, } for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) { // +CIPCLOSE:,,..., - bool thisMuxState = stream.parseInt(); - // Need to make sure a socket instace for the socket number exists - // before setting its state - GsmClientSim7600* sock = sockets[muxNo]; - if (sock) { - sock->sock_connected = thisMuxState; + bool muxState = stream.parseInt(); + if (sockets[muxNo]) { + sockets[muxNo]->sock_connected = muxState; } } waitResponse(); // Should be an OK at the end + if (!sockets[mux]) return false; return sockets[mux]->sock_connected; } @@ -808,6 +808,7 @@ class TinyGsmSim7600 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientSim7600* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index 4c47d38..cabfaca 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -528,6 +528,7 @@ class TinyGsmSim800 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; #ifdef TINY_GSM_USE_HEX sendAT(GF("+CIPRXGET=3,"), mux, ',', (uint16_t)size); if (waitResponse(GF("+CIPRXGET:")) != 1) { return 0; } @@ -575,6 +576,7 @@ class TinyGsmSim800 : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+CIPRXGET=4,"), mux); size_t result = 0; if (waitResponse(GF("+CIPRXGET:")) == 1) { @@ -734,6 +736,7 @@ class TinyGsmSim800 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientSim800* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientSaraR4.h b/src/TinyGsmClientSaraR4.h index 742e265..09dbd9f 100644 --- a/src/TinyGsmClientSaraR4.h +++ b/src/TinyGsmClientSaraR4.h @@ -707,6 +707,7 @@ class TinyGsmSaraR4 : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+USORD="), mux, ',', (uint16_t)size); if (waitResponse(GF(GSM_NL "+USORD:")) != 1) { return 0; } streamSkipUntil(','); // Skip mux @@ -722,6 +723,7 @@ class TinyGsmSaraR4 : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; // NOTE: Querying a closed socket gives an error "operation not allowed" sendAT(GF("+USORD="), mux, ",0"); size_t result = 0; @@ -735,7 +737,7 @@ class TinyGsmSaraR4 : public TinyGsmModem, waitResponse(); } if (!result) { sockets[mux]->sock_connected = modemGetConnected(mux); } - // DBG("### AvailablE:", result, "on", mux); + // DBG("### Available:", result, "on", mux); return result; } @@ -879,6 +881,7 @@ class TinyGsmSaraR4 : public TinyGsmModem, public: Stream& stream; + protected: GsmClientSaraR4* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index 1dd4eb6..98ea7a0 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -649,6 +649,7 @@ class TinyGsmUBLOX : public TinyGsmModem, } size_t modemRead(size_t size, uint8_t mux) { + if (!sockets[mux]) return 0; sendAT(GF("+USORD="), mux, ',', (uint16_t)size); if (waitResponse(GF(GSM_NL "+USORD:")) != 1) { return 0; } streamSkipUntil(','); // Skip mux @@ -664,6 +665,7 @@ class TinyGsmUBLOX : public TinyGsmModem, } size_t modemGetAvailable(uint8_t mux) { + if (!sockets[mux]) return 0; // NOTE: Querying a closed socket gives an error "operation not allowed" sendAT(GF("+USORD="), mux, ",0"); size_t result = 0; @@ -812,6 +814,7 @@ class TinyGsmUBLOX : public TinyGsmModem, public: Stream& stream; + protected: GsmClientUBLOX* sockets[TINY_GSM_MUX_COUNT]; const char* gsmNL = GSM_NL; diff --git a/src/TinyGsmTCP.tpp b/src/TinyGsmTCP.tpp index d7bd1df..cf73b45 100644 --- a/src/TinyGsmTCP.tpp +++ b/src/TinyGsmTCP.tpp @@ -332,6 +332,7 @@ class TinyGsmTCP { // !stream.available()" and then will wait again in the stream.read() // function. inline void moveCharFromStreamToFifo(uint8_t mux) { + if (!thisModem().sockets[mux]) return; uint32_t startMillis = millis(); while (!thisModem().stream.available() && (millis() - startMillis < thisModem().sockets[mux]->_timeout)) {