summaryrefslogtreecommitdiff
path: root/libgps.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2005-04-11 07:08:04 +0000
committerGary E. Miller <gem@rellim.com>2005-04-11 07:08:04 +0000
commit3de07387c40781acec723136686053afe907b5aa (patch)
tree495870e157d57bcb92216a5c8d0331d675b8f8be /libgps.c
parent04de7316d7ffd4543a03aef9fdf09bf123f417c0 (diff)
downloadgpsd-3de07387c40781acec723136686053afe907b5aa.tar.gz
Fix more potential coredumps in libgps.c
Diffstat (limited to 'libgps.c')
-rw-r--r--libgps.c90
1 files changed, 68 insertions, 22 deletions
diff --git a/libgps.c b/libgps.c
index 0c0aa6f0..63a2ce54 100644
--- a/libgps.c
+++ b/libgps.c
@@ -80,8 +80,12 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
switch (*sp) {
case 'A':
- sscanf(sp, "A=%lf", &gpsdata->fix.altitude);
- gpsdata->valid |= ALTITUDE_SET;
+ if (sp[2] == '?') {
+ gpsdata->fix.altitude = 0;
+ } else {
+ sscanf(sp, "A=%lf", &gpsdata->fix.altitude);
+ gpsdata->valid |= ALTITUDE_SET;
+ }
break;
case 'B':
if (sp[2] == '?') {
@@ -103,9 +107,15 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
}
break;
case 'E':
- sscanf(sp, "E=%lf %lf %lf",
+ if (sp[2] == '?') {
+ gpsdata->epe = 0;
+ gpsdata->fix.eph = 0;
+ gpsdata->fix.epv = 0;
+ } else {
+ sscanf(sp, "E=%lf %lf %lf",
&gpsdata->epe,&gpsdata->fix.eph,&gpsdata->fix.epv);
- gpsdata->valid |= HERR_SET| VERR_SET | PERR_SET;
+ gpsdata->valid |= HERR_SET| VERR_SET | PERR_SET;
+ }
break;
case 'F':
if (sp[2] == '?')
@@ -148,8 +158,12 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
}
break;
case 'M':
- gpsdata->fix.mode = atoi(sp+2);
- gpsdata->valid |= MODE_SET;
+ if (sp[2] == '?') {
+ gpsdata->fix.mode = 0;
+ } else {
+ gpsdata->fix.mode = atoi(sp+2);
+ gpsdata->valid |= MODE_SET;
+ }
break;
case 'N':
if (sp[2] == '?')
@@ -158,7 +172,9 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
gpsdata->driver_mode = atoi(sp+2);
break;
case 'O':
- {
+ if (sp[2] == '?') {
+ gpsdata->fix.mode = MODE_NOT_SEEN;
+ } else {
struct gps_fix_t nf;
char tag[MAXTAGLEN+1], alt[20];
char eph[20], epv[20], track[20],speed[20], climb[20];
@@ -202,31 +218,59 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
}
break;
case 'P':
- sscanf(sp, "P=%lf %lf",
+ if (sp[2] == '?') {
+ gpsdata->fix.latitude = 0;
+ gpsdata->fix.longitude = 0;
+ } else {
+ sscanf(sp, "P=%lf %lf",
&gpsdata->fix.latitude, &gpsdata->fix.longitude);
- gpsdata->valid |= LATLON_SET;
+ gpsdata->valid |= LATLON_SET;
+ }
break;
case 'Q':
- sscanf(sp, "Q=%d %lf %lf %lf",
+ if (sp[2] == '?') {
+ gpsdata->satellites_used = 0;
+ gpsdata->pdop = 0;
+ gpsdata->hdop = 0;
+ gpsdata->vdop = 0;
+ } else {
+ sscanf(sp, "Q=%d %lf %lf %lf",
&gpsdata->satellites_used,
&gpsdata->pdop, &gpsdata->hdop, &gpsdata->vdop);
- gpsdata->valid |= HDOP_SET | VDOP_SET | PDOP_SET;
+ gpsdata->valid |= HDOP_SET | VDOP_SET | PDOP_SET;
+ }
break;
case 'S':
- gpsdata->status = atoi(sp+2);
- gpsdata->valid |= STATUS_SET;
+ if (sp[2] == '?') {
+ gpsdata->status = 0;
+ } else {
+ gpsdata->status = atoi(sp+2);
+ gpsdata->valid |= STATUS_SET;
+ }
break;
case 'T':
- sscanf(sp, "T=%lf", &gpsdata->fix.track);
- gpsdata->valid |= TRACK_SET;
+ if (sp[2] == '?') {
+ gpsdata->fix.track = 0;
+ } else {
+ sscanf(sp, "T=%lf", &gpsdata->fix.track);
+ gpsdata->valid |= TRACK_SET;
+ }
break;
case 'U':
- sscanf(sp, "U=%lf", &gpsdata->fix.climb);
- gpsdata->valid |= CLIMB_SET;
+ if (sp[2] == '?') {
+ gpsdata->fix.climb = 0;
+ } else {
+ sscanf(sp, "U=%lf", &gpsdata->fix.climb);
+ gpsdata->valid |= CLIMB_SET;
+ }
break;
case 'V':
- sscanf(sp, "V=%lf", &gpsdata->fix.speed);
- gpsdata->valid |= SPEED_SET;
+ if (sp[2] == '?') {
+ gpsdata->fix.speed = 0;
+ } else {
+ sscanf(sp, "V=%lf", &gpsdata->fix.speed);
+ gpsdata->valid |= SPEED_SET;
+ }
break;
case 'X':
if (sp[2] == '?')
@@ -237,7 +281,9 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
}
break;
case 'Y':
- {
+ if (sp[2] == '?') {
+ gpsdata->satellites = 0;
+ } else {
int j, i1, i2, i3, i4, i5;
int PRN[MAXCHANNELS];
int elevation[MAXCHANNELS], azimuth[MAXCHANNELS];
@@ -246,8 +292,8 @@ static void gps_unpack(char *buf, struct gps_data_t *gpsdata)
sscanf(sp, "Y=%20s %20s %d ",
tag, timestamp, &gpsdata->satellites);
- if (tag[0] != '?') {
- strncpy(gpsdata->tag, tag, MAXTAGLEN);
+ strncpy(gpsdata->tag, tag, MAXTAGLEN);
+ if (timestamp[0] != '?') {
gpsdata->sentence_time = atof(timestamp);
gpsdata->valid |= TIME_SET;
}