Skip to content

Commit b062a77

Browse files
committed
Big memory leak fix -- see issue #2
1 parent aa069ff commit b062a77

File tree

2 files changed

+113
-30
lines changed

2 files changed

+113
-30
lines changed

src/SparkFun_LTE_Shield_Arduino_Library.cpp

Lines changed: 109 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#define LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT 1000
3333
#define LTE_SHIELD_SET_BAUD_TIMEOUT 500
3434
#define LTE_SHIELD_POWER_PULSE_PERIOD 3200
35+
#define LTE_RESET_PULSE_PERIOD 10000
3536
#define LTE_SHIELD_IP_CONNECT_TIMEOUT 60000
3637
#define LTE_SHIELD_POLL_DELAY 1
3738
#define LTE_SHIELD_SOCKET_WRITE_TIMEOUT 10000
@@ -449,18 +450,32 @@ String LTE_Shield::clock(void)
449450
sprintf(command, "%s?", LTE_SHIELD_COMMAND_CLOCK);
450451

451452
response = lte_calloc_char(48);
452-
if (response == NULL) return "";
453+
if (response == NULL)
454+
{
455+
free(command);
456+
return "";
457+
}
453458

454459
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
455460
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
456461
if (err != LTE_SHIELD_ERROR_SUCCESS) return "";
457462

458463
// Response format: \r\n+CCLK: "YY/MM/DD,HH:MM:SS-TZ"\r\n\r\nOK\r\n
459464
clockBegin = strchr(response, '\"'); // Find first quote
460-
if (clockBegin == NULL) return "";
465+
if (clockBegin == NULL)
466+
{
467+
free(command);
468+
free(response);
469+
return "";
470+
}
461471
clockBegin += 1; // Increment pointer to begin at first number
462472
clockEnd = strchr(clockBegin, '\"'); // Find last quote
463-
if (clockEnd == NULL) return "";
473+
if (clockEnd == NULL)
474+
{
475+
free(command);
476+
free(response);
477+
return "";
478+
}
464479
*(clockEnd) = '\0'; // Set last quote to null char -- end string
465480

466481
free(command);
@@ -485,7 +500,11 @@ LTE_Shield_error_t LTE_Shield::clock(uint8_t * y, uint8_t * mo, uint8_t * d,
485500
sprintf(command, "%s?", LTE_SHIELD_COMMAND_CLOCK);
486501

487502
response = lte_calloc_char(48);
488-
if (response == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
503+
if (response == NULL)
504+
{
505+
free(command);
506+
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
507+
}
489508

490509
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
491510
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
@@ -1069,12 +1088,21 @@ LTE_Shield::LTE_Shield_gpio_mode_t LTE_Shield::getGpioMode(LTE_Shield_gpio_t gpi
10691088
sprintf(command, "%s?", LTE_SHIELD_COMMAND_GPIO);
10701089

10711090
response = lte_calloc_char(96);
1072-
if (response == NULL) return GPIO_MODE_INVALID;
1091+
if (response == NULL)
1092+
{
1093+
free(command);
1094+
return GPIO_MODE_INVALID;
1095+
}
10731096

10741097
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
10751098
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
10761099

1077-
if (err != LTE_SHIELD_ERROR_SUCCESS) return GPIO_MODE_INVALID;
1100+
if (err != LTE_SHIELD_ERROR_SUCCESS)
1101+
{
1102+
free(command);
1103+
free(response);
1104+
return GPIO_MODE_INVALID;
1105+
}
10781106

10791107
sprintf(gpioChar, "%d", gpio); // Convert GPIO to char array
10801108
gpioStart = strstr(response, gpioChar); // Find first occurence of GPIO in response
@@ -1100,15 +1128,29 @@ int LTE_Shield::socketOpen(lte_shield_socket_protocol_t protocol, unsigned int l
11001128
sprintf(command, "%s=%d,%d", LTE_SHIELD_CREATE_SOCKET, protocol, localPort);
11011129

11021130
response = lte_calloc_char(24);
1103-
if (response == NULL) return -1;
1131+
if (response == NULL)
1132+
{
1133+
free(command);
1134+
return -1;
1135+
}
11041136

11051137
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
11061138
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
11071139

1108-
if (err != LTE_SHIELD_ERROR_SUCCESS) return -1;
1140+
if (err != LTE_SHIELD_ERROR_SUCCESS)
1141+
{
1142+
free(command);
1143+
free(response);
1144+
return -1;
1145+
}
11091146

11101147
responseStart = strstr(response, "+USOCR");
1111-
if (responseStart == NULL) return -1;
1148+
if (responseStart == NULL)
1149+
{
1150+
free(command);
1151+
free(response);
1152+
return -1;
1153+
}
11121154

11131155
sscanf(responseStart, "+USOCR: %d", &sockId);
11141156

@@ -1120,27 +1162,35 @@ int LTE_Shield::socketOpen(lte_shield_socket_protocol_t protocol, unsigned int l
11201162

11211163
LTE_Shield_error_t LTE_Shield::socketClose(int socket, int timeout)
11221164
{
1165+
LTE_Shield_error_t err;
11231166
char * command;
11241167

11251168
command = lte_calloc_char(strlen(LTE_SHIELD_CLOSE_SOCKET) + 10);
11261169
if (command == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
11271170
sprintf(command, "%s=%d", LTE_SHIELD_CLOSE_SOCKET, socket);
11281171

1129-
return sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
1130-
NULL, timeout);
1172+
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, NULL, timeout);
1173+
1174+
free(command);
1175+
1176+
return err;
11311177
}
11321178

11331179
LTE_Shield_error_t LTE_Shield::socketConnect(int socket, const char * address,
11341180
unsigned int port)
11351181
{
1182+
LTE_Shield_error_t err;
11361183
char * command;
11371184

11381185
command = lte_calloc_char(strlen(LTE_SHIELD_CONNECT_SOCKET) + strlen(address) + 11);
11391186
if (command == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
11401187
sprintf(command, "%s=%d,\"%s\",%d", LTE_SHIELD_CONNECT_SOCKET, socket, address, port);
11411188

1142-
return sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
1143-
NULL, LTE_SHIELD_IP_CONNECT_TIMEOUT);
1189+
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, NULL, LTE_SHIELD_IP_CONNECT_TIMEOUT);
1190+
1191+
free(command);
1192+
1193+
return err;
11441194
}
11451195

11461196
LTE_Shield_error_t LTE_Shield::socketWrite(int socket, const char * str)
@@ -1181,20 +1231,32 @@ LTE_Shield_error_t LTE_Shield::socketRead(int socket, int length, char * readDes
11811231
sprintf(command, "%s=%d,%d", LTE_SHIELD_READ_SOCKET, socket, length);
11821232

11831233
response = lte_calloc_char(length + strlen(LTE_SHIELD_READ_SOCKET) + 24);
1184-
if (response == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1234+
if (response == NULL)
1235+
{
1236+
free(command);
1237+
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1238+
}
11851239

11861240
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, response,
11871241
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
11881242

1189-
if (err != LTE_SHIELD_ERROR_SUCCESS) return err;
1190-
1191-
// Find the first double-quote:
1192-
strBegin = strchr(response, '\"');
1193-
if (strBegin == NULL) return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
1194-
while ((readIndex < length) && (readIndex < strlen(strBegin)))
1243+
if (err == LTE_SHIELD_ERROR_SUCCESS)
11951244
{
1196-
readDest[readIndex] = strBegin[1 + readIndex];
1197-
readIndex += 1;
1245+
// Find the first double-quote:
1246+
strBegin = strchr(response, '\"');
1247+
1248+
if (strBegin == NULL)
1249+
{
1250+
free(command);
1251+
free(response);
1252+
return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
1253+
}
1254+
1255+
while ((readIndex < length) && (readIndex < strlen(strBegin)))
1256+
{
1257+
readDest[readIndex] = strBegin[1 + readIndex];
1258+
readIndex += 1;
1259+
}
11981260
}
11991261

12001262
free(command);
@@ -1236,7 +1298,11 @@ boolean LTE_Shield::gpsOn(void)
12361298
sprintf(command, "%s?", LTE_SHIELD_GPS_POWER);
12371299

12381300
response = lte_calloc_char(24);
1239-
if (response == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1301+
if (response == NULL)
1302+
{
1303+
free(command);
1304+
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1305+
}
12401306

12411307
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, response,
12421308
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
@@ -1361,7 +1427,11 @@ LTE_Shield_error_t LTE_Shield::gpsGetRmc(struct PositionData * pos, struct Speed
13611427
sprintf(command, "%s?", LTE_SHIELD_GPS_GPRMC);
13621428

13631429
response = lte_calloc_char(96);
1364-
if (response == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1430+
if (response == NULL)
1431+
{
1432+
free(command);
1433+
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1434+
}
13651435

13661436
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK, response, 10000);
13671437
if (err == LTE_SHIELD_ERROR_SUCCESS)
@@ -1393,7 +1463,7 @@ LTE_Shield_error_t LTE_Shield::gpsGetSpeed(struct SpeedData * speed)
13931463
// AT+UGVTG?
13941464
}
13951465

1396-
LTE_Shield_error_t LTE_Shield::gpsRequest(unsigned int timeout, unsigned int accuracy,
1466+
LTE_Shield_error_t LTE_Shield::gpsRequest(unsigned int timeout, uint32_t accuracy,
13971467
boolean detailed)
13981468
{
13991469
// AT+ULOC=2,<useCellLocate>,<detailed>,<timeout>,<accuracy>
@@ -1467,13 +1537,20 @@ LTE_Shield_error_t LTE_Shield::init(unsigned long baud,
14671537

14681538
void LTE_Shield::powerOn(void)
14691539
{
1470-
if (_powerPin == NULL) return;
14711540
pinMode(_powerPin, OUTPUT);
14721541
digitalWrite(_powerPin, LOW);
14731542
delay(LTE_SHIELD_POWER_PULSE_PERIOD);
14741543
pinMode(_powerPin, INPUT); // Return to high-impedance, rely on SARA module internal pull-up
14751544
}
14761545

1546+
void LTE_Shield::hwReset(void)
1547+
{
1548+
pinMode(_resetPin, OUTPUT);
1549+
digitalWrite(_resetPin, LOW);
1550+
delay(LTE_RESET_PULSE_PERIOD);
1551+
pinMode(_resetPin, INPUT); // Return to high-impedance, rely on SARA module internal pull-up
1552+
}
1553+
14771554
LTE_Shield_error_t LTE_Shield::functionality(LTE_Shield_functionality_t function)
14781555
{
14791556
LTE_Shield_error_t err;
@@ -1523,7 +1600,11 @@ LTE_Shield_error_t LTE_Shield::getMno(mobile_network_operator_t * mno)
15231600
sprintf(command, "%s?", LTE_SHIELD_COMMAND_MNO);
15241601

15251602
response = lte_calloc_char(24);
1526-
if (response == NULL) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1603+
if (response == NULL)
1604+
{
1605+
free(command);
1606+
return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1607+
}
15271608

15281609
err = sendCommandWithResponse(command, LTE_SHIELD_RESPONSE_OK,
15291610
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
@@ -1535,7 +1616,7 @@ LTE_Shield_error_t LTE_Shield::getMno(mobile_network_operator_t * mno)
15351616
*mno = MNO_INVALID;
15361617
return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
15371618
}
1538-
*mno = (mobile_network_operator_t)(*(response + i) - 0x30); // Convert to integer
1619+
*mno = (mobile_network_operator_t)(response[i] - 0x30); // Convert to integer
15391620

15401621
free(command);
15411622
free(response);

src/SparkFun_LTE_Shield_Arduino_Library.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ class LTE_Shield : public Print {
299299
LTE_Shield_error_t gpsEnableSpeed(boolean enable = true);
300300
LTE_Shield_error_t gpsGetSpeed(struct SpeedData * speed);
301301

302-
LTE_Shield_error_t gpsRequest(unsigned int timeout, unsigned int accuracy, boolean detailed = true);
302+
LTE_Shield_error_t gpsRequest(unsigned int timeout, uint32_t accuracy, boolean detailed = true);
303303

304304
private:
305305

@@ -335,6 +335,8 @@ class LTE_Shield : public Print {
335335

336336
void powerOn(void);
337337

338+
void hwReset(void);
339+
338340
LTE_Shield_error_t functionality(LTE_Shield_functionality_t function = FULL_FUNCTIONALITY);
339341

340342
LTE_Shield_error_t setMno(mobile_network_operator_t mno);
@@ -369,4 +371,4 @@ class LTE_Shield : public Print {
369371
char * lte_calloc_char(size_t num);
370372
};
371373

372-
#endif SPARKFUN_LTE_SHIELD_ARDUINO_LIBRARY_H /* SPARKFUN_LTE_SHIELD_ARDUINO_LIBRARY_H */
374+
#endif //SPARKFUN_LTE_SHIELD_ARDUINO_LIBRARY_H

0 commit comments

Comments
 (0)