Skip to content

Commit

Permalink
Some more null pointer checks, fix #186
Browse files Browse the repository at this point in the history
Signed-off-by: Sara Damiano <sdamiano@stroudcenter.org>
  • Loading branch information
SRGDamia1 committed Apr 15, 2020
1 parent b9473c6 commit fb3f858
Show file tree
Hide file tree
Showing 13 changed files with 98 additions and 59 deletions.
41 changes: 24 additions & 17 deletions src/TinyGsmClientA6.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
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();
Expand Down Expand Up @@ -501,24 +501,28 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
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 = "";
Expand All @@ -529,7 +533,9 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
finish:
if (!index) {
data.trim();
if (data.length()) { DBG("### Unhandled:", data); }
if (data.length()) {
DBG("### Unhandled:", data);
}
data = "";
}
// data.replace(GSM_NL, "/");
Expand Down Expand Up @@ -561,10 +567,11 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
}

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_
3 changes: 3 additions & 0 deletions src/TinyGsmClientBG96.h
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,7 @@ class TinyGsmBG96 : public TinyGsmModem<TinyGsmBG96>,
}

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');
Expand All @@ -534,6 +535,7 @@ class TinyGsmBG96 : public TinyGsmModem<TinyGsmBG96>,
}

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) {
Expand Down Expand Up @@ -675,6 +677,7 @@ class TinyGsmBG96 : public TinyGsmModem<TinyGsmBG96>,

public:
Stream& stream;

protected:
GsmClientBG96* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
37 changes: 20 additions & 17 deletions src/TinyGsmClientESP8266.h
Original file line number Diff line number Diff line change
Expand Up @@ -315,9 +315,8 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
// 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;
Expand All @@ -339,9 +338,8 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
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];
Expand Down Expand Up @@ -391,17 +389,21 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
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"))) {
Expand Down Expand Up @@ -443,6 +445,7 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,

public:
Stream& stream;

protected:
GsmClientESP8266* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
27 changes: 16 additions & 11 deletions src/TinyGsmClientM590.h
Original file line number Diff line number Diff line change
Expand Up @@ -395,22 +395,26 @@ class TinyGsmM590 : public TinyGsmModem<TinyGsmM590>,
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 = "";
Expand Down Expand Up @@ -454,6 +458,7 @@ class TinyGsmM590 : public TinyGsmModem<TinyGsmM590>,

public:
Stream& stream;

protected:
GsmClientM590* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
3 changes: 3 additions & 0 deletions src/TinyGsmClientM95.h
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,7 @@ class TinyGsmM95 : public TinyGsmModem<TinyGsmM95>,
}

size_t modemRead(size_t size, uint8_t mux) {
if (!sockets[mux]) return 0;
// TODO(?): Does this work????
// AT+QIRD=<id>,<sc>,<sid>,<len>
// id = GPRS context number = 0, set in GPRS connect
Expand Down Expand Up @@ -482,6 +483,7 @@ class TinyGsmM95 : public TinyGsmModem<TinyGsmM95>,
}
}

// Not possible to check the number of characters remaining in buffer
size_t modemGetAvailable(uint8_t) {
return 0;
}
Expand Down Expand Up @@ -618,6 +620,7 @@ class TinyGsmM95 : public TinyGsmModem<TinyGsmM95>,

public:
Stream& stream;

protected:
GsmClientM95* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
5 changes: 4 additions & 1 deletion src/TinyGsmClientMC60.h
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,8 @@ class TinyGsmMC60 : public TinyGsmModem<TinyGsmMC60>,
}

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>,<sc>,<sid>,<len>
// id = GPRS context number = 0, set in GPRS connect
// sc = role in connection = 1, client of connection
Expand Down Expand Up @@ -441,6 +442,7 @@ class TinyGsmMC60 : public TinyGsmModem<TinyGsmMC60>,
}
}

// Not possible to check the number of characters remaining in buffer
size_t modemGetAvailable(uint8_t) {
return 0;
}
Expand Down Expand Up @@ -590,6 +592,7 @@ class TinyGsmMC60 : public TinyGsmModem<TinyGsmMC60>,

public:
Stream& stream;

protected:
GsmClientMC60* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
13 changes: 7 additions & 6 deletions src/TinyGsmClientSIM5360.h
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
}

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; }
Expand Down Expand Up @@ -560,6 +561,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
}

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) {
Expand All @@ -579,15 +581,13 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
if (waitResponse(GF("+CIPCLOSE:")) != 1) { return false; }
for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) {
// +CIPCLOSE:<link0_state>,<link1_state>,...,<link9_state>
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;
}

Expand Down Expand Up @@ -715,6 +715,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,

public:
Stream& stream;

protected:
GsmClientSim5360* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
3 changes: 3 additions & 0 deletions src/TinyGsmClientSIM7000.h
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,7 @@ class TinyGsmSim7000 : public TinyGsmModem<TinyGsmSim7000>,
}

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; }
Expand Down Expand Up @@ -597,6 +598,7 @@ class TinyGsmSim7000 : public TinyGsmModem<TinyGsmSim7000>,
}

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) {
Expand Down Expand Up @@ -756,6 +758,7 @@ class TinyGsmSim7000 : public TinyGsmModem<TinyGsmSim7000>,

public:
Stream& stream;

protected:
GsmClientSim7000* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
13 changes: 7 additions & 6 deletions src/TinyGsmClientSIM7600.h
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,7 @@ class TinyGsmSim7600 : public TinyGsmModem<TinyGsmSim7600>,
}

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; }
Expand Down Expand Up @@ -651,6 +652,7 @@ class TinyGsmSim7600 : public TinyGsmModem<TinyGsmSim7600>,
}

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) {
Expand All @@ -672,15 +674,13 @@ class TinyGsmSim7600 : public TinyGsmModem<TinyGsmSim7600>,
}
for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) {
// +CIPCLOSE:<link0_state>,<link1_state>,...,<link9_state>
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;
}

Expand Down Expand Up @@ -808,6 +808,7 @@ class TinyGsmSim7600 : public TinyGsmModem<TinyGsmSim7600>,

public:
Stream& stream;

protected:
GsmClientSim7600* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down
3 changes: 3 additions & 0 deletions src/TinyGsmClientSIM800.h
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,7 @@ class TinyGsmSim800 : public TinyGsmModem<TinyGsmSim800>,
}

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; }
Expand Down Expand Up @@ -575,6 +576,7 @@ class TinyGsmSim800 : public TinyGsmModem<TinyGsmSim800>,
}

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) {
Expand Down Expand Up @@ -734,6 +736,7 @@ class TinyGsmSim800 : public TinyGsmModem<TinyGsmSim800>,

public:
Stream& stream;

protected:
GsmClientSim800* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
Expand Down

0 comments on commit fb3f858

Please sign in to comment.