]> git.street.me.uk Git - andy/viking.git/commitdiff
Fix bugs that caused crashes on gps download/upload.
authorQuy Tonthat <qtonthat@gmail.com>
Mon, 2 Jul 2007 11:44:30 +0000 (11:44 +0000)
committerQuy Tonthat <qtonthat@gmail.com>
Mon, 2 Jul 2007 11:44:30 +0000 (11:44 +0000)
The problem was caused by the parser for gpsbabel debug output.
The fix should stop viking from crashing, but the progress dialog still may not
display counters accurately for some model of GPS. The fix was only tested
with Garmin GPS 12. Fixing problems for other GPS requires output of
"gpsbabel -D 9 -t -w -i garmin -f /dev/ttyUSB0 -o gpx -F /dev/null"

This fix also plugged a memory leak in the parser..

Signed-off-by: Quy Tonthat <qtonthat@gmail.com>
src/datasource_gps.c
src/vikgpslayer.c

index 2d1e2c63f2d3d59de8dabcd6b2388908507e8388..1fbbd67de43c46d0e21e253e68df5ab213f5bd4e 100644 (file)
@@ -192,23 +192,32 @@ static void datasource_gps_progress ( BabelProgressCode c, gpointer data, acq_di
       gchar info[128];
       int ilen = 0;
       int i;
-
-      for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
-       guint ch;
-       sscanf(tokens[i], "%x", &ch);
-       info[ilen++] = ch;
+      int n_tokens = 0;
+
+      while (tokens[n_tokens])
+        n_tokens++;
+
+      if (n_tokens > 8) {
+        for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
+         guint ch;
+         sscanf(tokens[i], "%x", &ch);
+         info[ilen++] = ch;
+        }
+        info[ilen++] = 0;
+        set_gps_info(info, w);
       }
-      info[ilen++] = 0;
-      set_gps_info(info, w);
+      g_strfreev(tokens);
     }
     if (strstr(line, "RECORD")) { 
       int lsb, msb, cnt;
 
-      sscanf(line+17, "%x", &lsb); 
-      sscanf(line+20, "%x", &msb);
-      cnt = lsb + msb * 256;
-      set_total_count(cnt, w);
-      gps_data->count = 0;
+      if (strlen(line) > 20) {
+       sscanf(line+17, "%x", &lsb); 
+       sscanf(line+20, "%x", &msb);
+       cnt = lsb + msb * 256;
+       set_total_count(cnt, w);
+       gps_data->count = 0;
+      }
     }
     if ( strstr(line, "WPTDAT") || strstr(line, "TRKHDR") || strstr(line, "TRKDAT") ) {
       gps_data->count++;
index b394deedf2003a50d8e728ea6cefb48beb3e5bf1..80d1c7e79aacd8f2a8fa8d48d6b65b74c3aa5920 100644 (file)
@@ -617,23 +617,32 @@ static void gps_download_progress_func(BabelProgressCode c, gpointer data, GpsSe
       gchar info[128];
       int ilen = 0;
       int i;
-
-      for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
-       guint ch;
-       sscanf(tokens[i], "%x", &ch);
-       info[ilen++] = ch;
+      int n_tokens = 0;
+
+      while (tokens[n_tokens])
+        n_tokens++;
+
+      if (n_tokens > 8) {
+        for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
+         guint ch;
+         sscanf(tokens[i], "%x", &ch);
+         info[ilen++] = ch;
+        }
+        info[ilen++] = 0;
+        set_gps_info(info, sess);
       }
-      info[ilen++] = 0;
-      set_gps_info(info, sess);
+      g_strfreev(tokens);
     }
     if (strstr(line, "RECORD")) { 
       int lsb, msb, cnt;
 
-      sscanf(line+17, "%x", &lsb); 
-      sscanf(line+20, "%x", &msb);
-      cnt = lsb + msb * 256;
-      set_total_count(cnt, sess);
-      sess->count = 0;
+      if (strlen(line) > 20) {
+        sscanf(line+17, "%x", &lsb); 
+        sscanf(line+20, "%x", &msb);
+        cnt = lsb + msb * 256;
+        set_total_count(cnt, sess);
+        sess->count = 0;
+      }
     }
     if ( strstr(line, "WPTDAT") || strstr(line, "TRKHDR") || strstr(line, "TRKDAT") ) {
       sess->count++;
@@ -673,23 +682,32 @@ static void gps_upload_progress_func(BabelProgressCode c, gpointer data, GpsSess
       gchar info[128];
       int ilen = 0;
       int i;
-
-      for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
-       guint ch;
-       sscanf(tokens[i], "%x", &ch);
-       info[ilen++] = ch;
+      int n_tokens = 0;
+
+      while (tokens[n_tokens])
+        n_tokens++;
+
+      if (n_tokens > 8) {
+        for (i=8; tokens[i] && ilen < sizeof(info)-2 && strcmp(tokens[i], "00"); i++) {
+         guint ch;
+         sscanf(tokens[i], "%x", &ch);
+         info[ilen++] = ch;
+        }
+        info[ilen++] = 0;
+        set_gps_info(info, sess);
       }
-      info[ilen++] = 0;
-      set_gps_info(info, sess);
+      g_strfreev(tokens);
     }
     if (strstr(line, "RECORD")) { 
       int lsb, msb;
 
-      sscanf(line+17, "%x", &lsb); 
-      sscanf(line+20, "%x", &msb);
-      cnt = lsb + msb * 256;
-      /* set_total_count(cnt, sess); */
-      sess->count = 0;
+      if (strlen(line) > 20) {
+        sscanf(line+17, "%x", &lsb); 
+        sscanf(line+20, "%x", &msb);
+        cnt = lsb + msb * 256;
+        /* set_total_count(cnt, sess); */
+        sess->count = 0;
+      }
     }
     if ( strstr(line, "WPTDAT")) {
       if (sess->count == 0) {