From 70bc629b902f50f1c16d366056440519e6ed2cca Mon Sep 17 00:00:00 2001 From: John Klug Date: Wed, 1 Feb 2017 12:44:43 -0600 Subject: Prevent gpsd from crashing when system clock changes with debug >= 4 --- .../gpsd/gpsd-3.16/0006-sysclockcrash.patch | 48 ++++++++++++++++++++++ recipes-navigation/gpsd/gpsd_3.16.bb | 1 + 2 files changed, 49 insertions(+) create mode 100644 recipes-navigation/gpsd/gpsd-3.16/0006-sysclockcrash.patch (limited to 'recipes-navigation') diff --git a/recipes-navigation/gpsd/gpsd-3.16/0006-sysclockcrash.patch b/recipes-navigation/gpsd/gpsd-3.16/0006-sysclockcrash.patch new file mode 100644 index 0000000..e6b90f0 --- /dev/null +++ b/recipes-navigation/gpsd/gpsd-3.16/0006-sysclockcrash.patch @@ -0,0 +1,48 @@ +Before the fix, sample PPS Logs: +gpsd:PROG: KPPS:/dev/pps0 Clear cycle: -1236963952, duration: 1000000 @ (null) +gpsd:PROG: PPS:/dev/pps0 Clear cycle: 0, duration: 1000000 @ (null) + +With this fix, we see logs like this: +gpsd:PROG: KPPS:/dev/pps0 Clear cycle: 1000010, duration: 100003 @ 1577729345.554599378 +gpsd:PROG: PPS:/dev/pps0 Clear cycle: 1000010, duration: 100003 @ 1577729345.554599378 + +When the system clock changes without this fix, and the +debug level is 4 or greater, GPSD crashes on 32 bit ARM. +This fix prevents strlen() in vfprintf() from being given +a garbage pointer. cycle, cycle_kpps, duration and +duration_kpps are defined as long long, so by the C +standard, the format string is %lld. +======================================================================= +diff -Naur old/ppsthread.c new/ppsthread.c +--- old/ppsthread.c 2017-02-01 11:36:31.575212221 -0600 ++++ new/ppsthread.c 2017-02-01 11:44:48.269536679 -0600 +@@ -770,10 +770,9 @@ + edge_str = edge ? "Assert" : "Clear"; + cycle = cycle_tio; + duration = duration_tio; +- + timespec_str( &clock_ts, ts_str1, sizeof(ts_str1) ); + thread_context->log_hook(thread_context, THREAD_PROG, +- "TPPS:%s %.10s cycle: %d, duration: %d @ %s\n", ++ "TPPS:%s %.10s cycle: %lld, duration: %lld @ %s\n", + thread_context->devicename, edge_str, cycle, duration, + ts_str1); + +@@ -840,7 +839,7 @@ + + timespec_str( &clock_ts_kpps, ts_str1, sizeof(ts_str1) ); + thread_context->log_hook(thread_context, THREAD_PROG, +- "KPPS:%s %.10s cycle: %7d, duration: %7d @ %s\n", ++ "KPPS:%s %.10s cycle: %7lld, duration: %7lld @ %s\n", + thread_context->devicename, + edge_str, + cycle_kpps, duration_kpps, ts_str1); +@@ -898,7 +897,7 @@ + state_last = state; + timespec_str( &clock_ts, ts_str1, sizeof(ts_str1) ); + thread_context->log_hook(thread_context, THREAD_PROG, +- "PPS:%s %.10s cycle: %7d, duration: %7d @ %s\n", ++ "PPS:%s %.10s cycle: %7lld, duration: %7lld @ %s\n", + thread_context->devicename, + edge_str, + cycle, duration, ts_str1); diff --git a/recipes-navigation/gpsd/gpsd_3.16.bb b/recipes-navigation/gpsd/gpsd_3.16.bb index d6c51f4..baeeb0b 100644 --- a/recipes-navigation/gpsd/gpsd_3.16.bb +++ b/recipes-navigation/gpsd/gpsd_3.16.bb @@ -16,6 +16,7 @@ SRC_URI = "${SAVANNAH_GNU_MIRROR}/${BPN}/${BP}.tar.gz \ file://0005-suppress-text-in-binary.patch \ file://0006-ubxtimelps.patch \ file://0006-itu_r_tf_460_6.patch \ + file://0006-sysclockcrash.patch \ file://gpsd-default \ file://gpsd \ file://gpsd_ubx_fixed.sh \ -- cgit v1.2.3