Blob Blame History Raw
diff -urN -U20 gpsbabel-1.4.4.orig/garmin_fit.c gpsbabel-1.4.4/garmin_fit.c
--- gpsbabel-1.4.4.orig/garmin_fit.c	2012-05-14 07:59:17.000000000 -0700
+++ gpsbabel-1.4.4/garmin_fit.c	2013-07-30 22:59:03.675857670 -0700
@@ -96,40 +96,46 @@
           ver >> 4, ver & 0xf);
   if (global_opts.debug_level >= 1) {
     debug_print(1,"%s: protocol version=%d\n", MYNAME, ver);
   }
 
   // profile version
   ver = gbfgetuint16(fin);
   // data length
   fit_data.len = gbfgetuint32(fin);
   // File signature
   is_fatal(gbfread(sig, 4, 1, fin) != 1,
            MYNAME ": Unexpected end of file\n");
   if (sig[0] != '.' || sig[1] != 'F' || sig[2] != 'I' || sig[3] != 'T') {
     fatal(MYNAME ": .FIT signature missing\n");
   }
 
   if (global_opts.debug_level >= 1) {
     debug_print(1,"%s: profile version=%d\n", MYNAME, ver);
     debug_print(1,"%s: fit_data.len=%d\n", MYNAME, fit_data.len);
   }
+
+  if (len > 12) {
+    is_fatal(len != 14, MYNAME ": .FIT header with unrecognized size\n");
+    // Unused according to Ingo Arndt
+    gbfgetuint16(fin);
+  }
 }
 
 static gbuint8
 fit_getuint8(void)
 {
   int val;
 
   if (fit_data.len == 0) {
     // fail gracefully for GARMIN Edge 800 with newest firmware, seems to write a wrong record length
     // for the last record.
     //fatal(MYNAME ": record truncated: fit_data.len=0\n");
     if (global_opts.debug_level >= 1) {
       warning("%s: record truncated: fit_data.len=0\n", MYNAME);
     }
     return 0;
   }
   val = gbfgetc(fin);
   if (val == EOF) {
     fatal(MYNAME ": unexpected end of file with fit_data.len=%d\n",fit_data.len);
   }