summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2015-03-24 13:29:56 -0400
committerEric S. Raymond <esr@thyrsus.com>2015-03-24 13:29:56 -0400
commit8c7d91975cd63312272edee54aa7b8bdec1f7c17 (patch)
tree32a5a6db94708989257f83a457b66bdd08d6071f
parent6ed6c19c2309980751cd4609d7ec64180174b23f (diff)
downloadgpsd-8c7d91975cd63312272edee54aa7b8bdec1f7c17.tar.gz
Fix Savannah bug #44619: Bad latitude value for message type 17
Required one checkfile rebuild to integrate the sentence that triggered the error. All regression tests pass.
-rw-r--r--driver_ais.c4
-rw-r--r--test/sample.aivdm21
-rw-r--r--test/sample.aivdm.chk1
-rw-r--r--test/sample.aivdm.js.chk1
-rw-r--r--test/sample.aivdm.ju.chk1
5 files changed, 20 insertions, 8 deletions
diff --git a/driver_ais.c b/driver_ais.c
index 5fe727c8..efc897de 100644
--- a/driver_ais.c
+++ b/driver_ais.c
@@ -809,8 +809,8 @@ bool ais_binary_decode(const struct gpsd_errout_t *errout,
case 17: /* GNSS Broadcast Binary Message */
RANGE_CHECK(80, 816);
//ais->type17.spare = UBITS(38, 2);
- ais->type17.lon = UBITS(40, 18);
- ais->type17.lat = UBITS(58, 17);
+ ais->type17.lon = SBITS(40, 18);
+ ais->type17.lat = SBITS(58, 17);
//ais->type17.spare = UBITS(75, 5);
ais->type17.bitcount = bitlen - 80;
(void)memcpy(ais->type17.bitdata,
diff --git a/test/sample.aivdm b/test/sample.aivdm
index 70b7d94c..cc413c39 100644
--- a/test/sample.aivdm
+++ b/test/sample.aivdm
@@ -667,12 +667,21 @@
# decoders.
!AIVDM,2,1,5,A,A02VqLPA4I6C07h5Ed1h<OrsuBTTwS?r:C?w`?la<gno1RTRwSP9:BcurA8a,0*3A
!AIVDM,2,2,5,A,:Oko02TSwu8<:Jbb,0*11
-Message Type : 17
-Repeat Indicator : 0
-MMSI : 2734450
-Longitude : 17478
-Latitude : 35992
-DGNSS data : 376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
+# Message Type : 17
+# Repeat Indicator : 0
+# MMSI : 2734450
+# Longitude : 17478
+# Latitude : 35992
+# DGNSS data : 376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
+#
+# This one was found in the wild. It has a negative latitude.
+!AIVDM,1,1,1,A,A;wUJKU>io;WlWuwH`W1PpnuN<isf;5iHtOM1S6q?vsvNrNGOqLcr5mfD6t,2*51,d-127,S1378,t024436.00,T36.76385108,r09SCHA1,1272422678
+# Message Type : 17
+# Repeat Indicator : 0
+# MMSI : 804870766
+# Longitude : 80669
+# Latitude : -26818
+# DGNSS data : 272:7f7f6289c1838dbd78cc7bb8b17163c7dd0631b93feefe7ba7977f972be85d6e506f
#
# Type 18:
# From Kurt Schwehr. Checked with the noaadata tools.
diff --git a/test/sample.aivdm.chk b/test/sample.aivdm.chk
index cbc42569..6951630c 100644
--- a/test/sample.aivdm.chk
+++ b/test/sample.aivdm.chk
@@ -40,6 +40,7 @@
15|0|211439370|211507560|5|0|55|663|605843451|32|560
16|0|002053501|224251000|200|0|0|0|0
17|0|002734450|17478|35992|376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
+17|0|804870766|80669|-26818|272:7f7f6289c1838dbd78cc7bb8b17163c7dd0631b93feefe7ba7977f972be85d6e506f
18|0|338087471|0|1|0|-44443279|24410724|796|511|49|0x0|1|0|1|1|1|1|0xe0006
18|0|338088483|0|0|0|-42486718|25869335|1716|511|20|0x0|1|0|1|1|1|1|0xe0006
18|0|368161000|0|51|1|-43340309|23688555|349|511|17|0x0|1|0|1|1|0|1|0xe0006
diff --git a/test/sample.aivdm.js.chk b/test/sample.aivdm.js.chk
index 2584fefa..ccfa4281 100644
--- a/test/sample.aivdm.js.chk
+++ b/test/sample.aivdm.js.chk
@@ -40,6 +40,7 @@
{"class":"AIS","device":"stdin","type":15,"repeat":0,"mmsi":211439370,"scaled":true,"mmsi1":211507560,"type1_1":5,"offset1_1":0,"type1_2":55,"offset1_2":663,"mmsi2":605843451,"type2_1":32,"offset2_1":560}
{"class":"AIS","device":"stdin","type":16,"repeat":0,"mmsi":2053501,"scaled":true,"mmsi1":224251000,"offset1":200,"increment1":0,"mmsi2":0,"offset2":0,"increment2":0}
{"class":"AIS","device":"stdin","type":17,"repeat":0,"mmsi":2734450,"scaled":true,"lon":29.1,"lat":60.0,"data":"376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa"}
+{"class":"AIS","device":"stdin","type":17,"repeat":0,"mmsi":804870766,"scaled":true,"lon":134.4,"lat":-44.7,"data":"272:7f7f6289c1838dbd78cc7bb8b17163c7dd0631b93feefe7ba7977f972be85d6e506f"}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":338087471,"scaled":true,"reserved":0,"speed":0.1,"accuracy":false,"lon":-74.0721,"lat":40.6845,"course":79.6,"heading":511,"second":49,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":338088483,"scaled":true,"reserved":0,"speed":0.0,"accuracy":false,"lon":-70.8112,"lat":43.1156,"course":171.6,"heading":511,"second":20,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":368161000,"scaled":true,"reserved":0,"speed":5.1,"accuracy":true,"lon":-72.2338,"lat":39.4809,"course":34.9,"heading":511,"second":17,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":false,"raim":true,"radio":917510}
diff --git a/test/sample.aivdm.ju.chk b/test/sample.aivdm.ju.chk
index 4da54056..a6de2b3b 100644
--- a/test/sample.aivdm.ju.chk
+++ b/test/sample.aivdm.ju.chk
@@ -40,6 +40,7 @@
{"class":"AIS","device":"stdin","type":15,"repeat":0,"mmsi":211439370,"scaled":false,"mmsi1":211507560,"type1_1":5,"offset1_1":0,"type1_2":55,"offset1_2":663,"mmsi2":605843451,"type2_1":32,"offset2_1":560}
{"class":"AIS","device":"stdin","type":16,"repeat":0,"mmsi":2053501,"scaled":false,"mmsi1":224251000,"offset1":200,"increment1":0,"mmsi2":0,"offset2":0,"increment2":0}
{"class":"AIS","device":"stdin","type":17,"repeat":0,"mmsi":2734450,"scaled":false,"lon":17478,"lat":35992,"data":"376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa"}
+{"class":"AIS","device":"stdin","type":17,"repeat":0,"mmsi":804870766,"scaled":false,"lon":80669,"lat":-26818,"data":"272:7f7f6289c1838dbd78cc7bb8b17163c7dd0631b93feefe7ba7977f972be85d6e506f"}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":338087471,"scaled":false,"reserved":0,"speed":1,"accuracy":false,"lon":-44443279,"lat":24410724,"course":796,"heading":511,"second":49,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":338088483,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":-42486718,"lat":25869335,"course":1716,"heading":511,"second":20,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":368161000,"scaled":false,"reserved":0,"speed":51,"accuracy":true,"lon":-43340309,"lat":23688555,"course":349,"heading":511,"second":17,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":false,"raim":true,"radio":917510}