summaryrefslogtreecommitdiff
path: root/driver_nmea0183.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2019-03-14 14:39:40 -0700
committerGary E. Miller <gem@rellim.com>2019-03-14 14:39:40 -0700
commit1f732455a83c30108826bdc947c84ec462dc7b82 (patch)
treeb482c068917979e1edea991da6da92e641264474 /driver_nmea0183.c
parentb906fe293e3fd80eb1e00d08a98c4442f5524014 (diff)
downloadgpsd-1f732455a83c30108826bdc947c84ec462dc7b82.tar.gz
driver_nmea0183: Be more paranoid in merge_ddmmyy()
Check for properly formatted ddmmyy string.
Diffstat (limited to 'driver_nmea0183.c')
-rw-r--r--driver_nmea0183.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/driver_nmea0183.c b/driver_nmea0183.c
index b0c71964..30e07f88 100644
--- a/driver_nmea0183.c
+++ b/driver_nmea0183.c
@@ -6,6 +6,7 @@
/* for vsnprintf() FreeBSD wants __ISO_C_VISIBLE >= 1999 */
#define __ISO_C_VISIBLE 1999
+#include <ctype.h> /* for isdigit() */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
@@ -133,6 +134,31 @@ static int merge_ddmmyy(char *ddmmyy, struct gps_device_t *session)
int mon = DD(ddmmyy + 2);
int mday = DD(ddmmyy);
int year;
+ int i;
+
+ if (NULL == ddmmyy) {
+ return 1;
+ }
+ for (i = 0; i < 6; i++) {
+ if (0 == isdigit(ddmmyy[i])) {
+ /* catches NUL and non-digits */
+ /* Telit HE910 can set year to "-9" */
+ gpsd_log(&session->context->errout, LOG_WARN,
+ "merge_ddmmyy(%s), malformed date\n", ddmmyy);
+ return 2;
+ }
+ }
+ /* check for termination */
+ if ('\0' != ddmmyy[6]) {
+ /* missing NUL */
+ gpsd_log(&session->context->errout, LOG_WARN,
+ "merge_ddmmyy(%s), malformed date\n", ddmmyy);
+ return 3;
+ }
+
+ yy = DD(ddmmyy + 4);
+ mon = DD(ddmmyy + 2);
+ mday = DD(ddmmyy);
/* check for century wrap */
if (session->nmea.date.tm_year % 100 == 99 && yy == 0)
@@ -142,11 +168,11 @@ static int merge_ddmmyy(char *ddmmyy, struct gps_device_t *session)
if ( (1 > mon ) || (12 < mon ) ) {
gpsd_log(&session->context->errout, LOG_WARN,
"merge_ddmmyy(%s), malformed month\n", ddmmyy);
- return 1;
+ return 4;
} else if ( (1 > mday ) || (31 < mday ) ) {
gpsd_log(&session->context->errout, LOG_WARN,
"merge_ddmmyy(%s), malformed day\n", ddmmyy);
- return 1;
+ return 5;
} else {
gpsd_log(&session->context->errout, LOG_DATA,
"merge_ddmmyy(%s) sets year %d\n",