From 19e9c0cb480851a6e64ff9b5ce33861765a6e6ee Mon Sep 17 00:00:00 2001 From: Jeroen Elebaut Date: Tue, 24 Nov 2009 15:36:32 -0800 Subject: serial: handle arbitrary amounts of 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). --- src/mm-serial-parsers.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src') 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 '' */ + /* Ends with one or more '' */ 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 '' */ + /* Starts with one or more '' */ 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); -- cgit v1.2.3-70-g09d2