aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Elebaut <J.Elebaut@option.com>2009-11-24 15:36:32 -0800
committerDan Williams <dcbw@redhat.com>2009-11-24 15:36:32 -0800
commit19e9c0cb480851a6e64ff9b5ce33861765a6e6ee (patch)
treed38f66db72ae0b33d94aea9b716f3b11cb603ccb
parent50412ba3f9fe6b3ee33a83d452155b7f224ff719 (diff)
serial: handle arbitrary amounts of <CR><LF> padding in responses
Firmware on some Option devices (iCON 505) likes to spray newlines all over the place. Some fixes and boundary checks by me (dcbw).
-rw-r--r--src/mm-serial-parsers.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/mm-serial-parsers.c b/src/mm-serial-parsers.c
index b36496ff..58985d90 100644
--- a/src/mm-serial-parsers.c
+++ b/src/mm-serial-parsers.c
@@ -26,15 +26,19 @@ response_clean (GString *response)
{
char *s;
- /* Ends with '<CR><LF>' */
+ /* Ends with one or more '<CR><LF>' */
s = response->str + response->len - 1;
- if (*s == '\n' && *(--s) == '\r')
+ while ((s > response->str) && (*s == '\n') && (*(s - 1) == '\r')) {
g_string_truncate (response, response->len - 2);
+ s -= 2;
+ }
- /* Starts with '<CR><LF>' */
+ /* Starts with one or more '<CR><LF>' */
s = response->str;
- if (*s == '\r' && *(++s) == '\n')
+ while ((response->len >= 2) && (*s == '\r') && (*(s + 1) == '\n')) {
g_string_erase (response, 0, 2);
+ s = response->str;
+ }
}
@@ -199,7 +203,7 @@ mm_serial_parser_v1_new (void)
parser = g_slice_new (MMSerialParserV1);
- parser->regex_ok = g_regex_new ("\\r\\nOK\\r\\n$", flags, 0, NULL);
+ parser->regex_ok = g_regex_new ("\\r\\nOK(\\r\\n)+$", flags, 0, NULL);
parser->regex_connect = g_regex_new ("\\r\\nCONNECT.*\\r\\n", flags, 0, NULL);
parser->regex_detailed_error = g_regex_new ("\\r\\n\\+CME ERROR: (\\d+)\\r\\n$", flags, 0, NULL);
parser->regex_unknown_error = g_regex_new ("\\r\\n(ERROR)|(COMMAND NOT SUPPORT)\\r\\n$", flags, 0, NULL);