summaryrefslogtreecommitdiff
path: root/libgps_json.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2018-07-10 18:47:22 -0700
committerGary E. Miller <gem@rellim.com>2018-07-10 18:47:22 -0700
commitf9ddc803eb456e97a3b84d176255d0b1154a4e0d (patch)
tree3f14fb4d9164a6ca5900e3287238da4bcc715f5a /libgps_json.c
parent6e2842d3ef52af63f1211db7f880e87f59761e35 (diff)
downloadgpsd-f9ddc803eb456e97a3b84d176255d0b1154a4e0d.tar.gz
libgps_json.c: change isnan() to isfinite()
Odd, +Ing and -Inf are NaN, but isnan() says they are not! This can lead to client crash. Use isfinite() instead, changing the sense of the test.
Diffstat (limited to 'libgps_json.c')
-rw-r--r--libgps_json.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/libgps_json.c b/libgps_json.c
index 8afd789d..d0016c37 100644
--- a/libgps_json.c
+++ b/libgps_json.c
@@ -14,6 +14,14 @@ PERMISSIONS
***************************************************************************/
+#ifdef __linux__
+/* isfinite() needs _POSIX_C_SOURCE >= 200112L
+ * isnan(+Inf) is false, isfinite(+Inf) is false
+ * use isfinite() to make sure a float is valid
+ */
+#define _POSIX_C_SOURCE 200112L
+#endif /* __linux__ */
+
#include <stdbool.h>
#include <math.h>
#include <string.h>
@@ -461,33 +469,33 @@ int libgps_json_unpack(const char *buf,
if (str_starts_with(classtag, "\"class\":\"TPV\"")) {
status = json_tpv_read(buf, gpsdata, end);
gpsdata->set = STATUS_SET;
- if (isnan(gpsdata->fix.time) == 0)
+ if (isfinite(gpsdata->fix.time) != 0)
gpsdata->set |= TIME_SET;
- if (isnan(gpsdata->fix.ept) == 0)
+ if (isfinite(gpsdata->fix.ept) != 0)
gpsdata->set |= TIMERR_SET;
- if (isnan(gpsdata->fix.longitude) == 0)
+ if (isfinite(gpsdata->fix.longitude) != 0)
gpsdata->set |= LATLON_SET;
- if (isnan(gpsdata->fix.altitude) == 0)
+ if (isfinite(gpsdata->fix.altitude) != 0)
gpsdata->set |= ALTITUDE_SET;
- if (isnan(gpsdata->fix.epx) == 0 && isnan(gpsdata->fix.epy) == 0)
+ if (isfinite(gpsdata->fix.epx) != 0 && isfinite(gpsdata->fix.epy) != 0)
gpsdata->set |= HERR_SET;
- if (isnan(gpsdata->fix.epv) == 0)
+ if (isfinite(gpsdata->fix.epv) != 0)
gpsdata->set |= VERR_SET;
- if (isnan(gpsdata->fix.track) == 0)
+ if (isfinite(gpsdata->fix.track) != 0)
gpsdata->set |= TRACK_SET;
- if (isnan(gpsdata->fix.magnetic_track) == 0)
- gpsdata->set |= MAGNETIC_TRACK_SET;
- if (isnan(gpsdata->fix.speed) == 0)
+ if (isfinite(gpsdata->fix.magnetic_track) != 0)
+ gpsdata->set |= MAGNETIC_TRACK_SET;
+ if (isfinite(gpsdata->fix.speed) != 0)
gpsdata->set |= SPEED_SET;
- if (isnan(gpsdata->fix.climb) == 0)
+ if (isfinite(gpsdata->fix.climb) != 0)
gpsdata->set |= CLIMB_SET;
- if (isnan(gpsdata->fix.epd) == 0)
+ if (isfinite(gpsdata->fix.epd) != 0)
gpsdata->set |= TRACKERR_SET;
- if (isnan(gpsdata->fix.eps) == 0)
+ if (isfinite(gpsdata->fix.eps) != 0)
gpsdata->set |= SPEEDERR_SET;
- if (isnan(gpsdata->fix.epc) == 0)
+ if (isfinite(gpsdata->fix.epc) != 0)
gpsdata->set |= CLIMBERR_SET;
- if (isnan(gpsdata->fix.epc) == 0)
+ if (isfinite(gpsdata->fix.epc) != 0)
gpsdata->set |= CLIMBERR_SET;
if (gpsdata->fix.mode != MODE_NOT_SEEN)
gpsdata->set |= MODE_SET;