Skip to content

Commit d4b6117

Browse files
committed
Fix AT_CellularSMS::list_messages breaking in text mode when CRLF is contained in SMS payload text
1 parent 1c1243e commit d4b6117

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

connectivity/cellular/include/cellular/framework/API/ATHandler.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,13 @@ class ATHandler {
318318
*/
319319
void skip_param(ssize_t len, uint32_t count);
320320

321+
/** Consumes the given length from the reading buffer even if the stop tag has been found
322+
*
323+
* @param len length to be consumed from reading buffer
324+
* @param count number of parameters to be skipped
325+
*/
326+
void skip_param_bytes(ssize_t len, uint32_t count);
327+
321328
/** Reads given number of bytes from receiving buffer without checking any subparameter delimiters, such as comma.
322329
*
323330
* @param buf output buffer for the read
@@ -408,6 +415,12 @@ class ATHandler {
408415
*/
409416
bool consume_to_stop_tag();
410417

418+
/** Consumes the received content until current stop tag is found even if stop tag has been found previously
419+
*
420+
* @return true if stop tag is found, false otherwise
421+
*/
422+
bool consume_to_stop_tag_even_found();
423+
411424
/** Return the last 3GPP error code.
412425
* @return last 3GPP error code
413426
*/

connectivity/cellular/source/framework/AT/AT_CellularSMS.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,8 +1058,18 @@ nsapi_error_t AT_CellularSMS::list_messages()
10581058
// +CMGL: <index>,<stat>,<oa/da>,[<alpha>],[<scts>][,<tooa/toda>,<length>]<CR><LF><data>[<CR><LF>
10591059
// +CMGL: <index>,<stat>,<da/oa>,[<alpha>],[<scts>][,<tooa/toda>,<length>]<CR><LF><data>[...]]
10601060
index = _at.read_int();
1061-
(void)_at.consume_to_stop_tag(); // consume until <CR><LF>
1062-
(void)_at.consume_to_stop_tag(); // consume until <CR><LF>
1061+
_at.read_string(buffer, SMS_STATUS_SIZE);
1062+
_at.read_string(buffer, SMS_MAX_PHONE_NUMBER_SIZE);
1063+
_at.skip_param(); // <alpha>
1064+
_at.read_string(buffer, SMS_MAX_TIME_STAMP_SIZE);
1065+
_at.read_int();
1066+
int size = _at.read_int(); // length
1067+
_at.consume_to_stop_tag(); // consume until <CR><LF> end of header
1068+
if (size > 0) {
1069+
// we can not use skip param because we already consumed stop tag
1070+
_at.skip_param_bytes(size, 1);
1071+
}
1072+
_at.consume_to_stop_tag_even_found(); // consume until <CR><LF> -> data
10631073
}
10641074

10651075
if (index >= 0) {

connectivity/cellular/source/framework/device/ATHandler.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,26 @@ void ATHandler::skip_param(ssize_t len, uint32_t count)
484484
return;
485485
}
486486

487+
void ATHandler::skip_param_bytes(ssize_t len, uint32_t count)
488+
{
489+
if (!ok_to_proceed()) {
490+
return;
491+
}
492+
493+
for (uint32_t i = 0; i < count; i++) {
494+
ssize_t read_len = 0;
495+
while (read_len < len) {
496+
int c = get_char();
497+
if (c == -1) {
498+
set_error(NSAPI_ERROR_DEVICE_ERROR);
499+
return;
500+
}
501+
read_len++;
502+
}
503+
}
504+
return;
505+
}
506+
487507
ssize_t ATHandler::read_bytes(uint8_t *buf, size_t len)
488508
{
489509
if (!ok_to_proceed()) {
@@ -1093,6 +1113,26 @@ bool ATHandler::consume_to_stop_tag()
10931113
return false;
10941114
}
10951115

1116+
1117+
bool ATHandler::consume_to_stop_tag_even_found()
1118+
{
1119+
if (_error_found) {
1120+
return true;
1121+
}
1122+
1123+
if (!_is_fh_usable) {
1124+
_last_err = NSAPI_ERROR_BUSY;
1125+
return true;
1126+
}
1127+
1128+
if (consume_to_tag((const char *)_stop_tag->tag, true)) {
1129+
return true;
1130+
}
1131+
1132+
clear_error();
1133+
return false;
1134+
}
1135+
10961136
// consume by size needed?
10971137

10981138
void ATHandler::resp_stop()

0 commit comments

Comments
 (0)