[Gpsbabel-code] Bug in nmea.c
Brought to you by:
robertl
From: Robert L. <rob...@gm...> - 2014-03-05 17:39:55
|
Thanx for the good description. How about char* orig_tbuf = buf at the top and changing the xfree to just unconditionally free orig_tbuf? Also, please include a test case for your Blackview thing in testold/nmea.test and a few sentences that adds it to the doc in xmldoc/formats/nmea.xml This function is the poster child why I want to get out of the malloc/cstring business... On Wed Mar 05 2014 at 6:39:54 AM, Din <sup...@gm...> wrote: > Hello! > > Think I've found a bug in nmea.c > function: nmea_parse_one_line(char* ibuf) > > .... > if (0 == strncmp(tbuf, "---,", 4)) { > > > tbuf += 4; > } > tbuf now doesn't point to the correctly allocated memory > and is not equal to ibuf > > if the following condition goes false > if (strstr(tbuf, ",,")) { /// -> false > tbuf = gstrsub(tbuf, ",,", ",0,"); > } > > we get free memory error > if (tbuf != ibuf) { > ........... > xfree(tbuf); > } > > So... the following patch works correct > and also covers BlackView gps (nmea) data format > which includes additional info at the beginning > ex: > [1388140897124]$GPGGA,064142.999,5547.7374,N,03732.6450,E, > 1,09,1.1,163.9,M,13.7,M,,0000*57 > > > @@ -909,6 +909,8 @@ nmea_parse_one_line(char* ibuf) > char* ck; > int ckval, ckcmp; > char* tbuf = lrtrim(ibuf); > + int bNeedFree = 0; > + char *pPass = NULL; > > /* > * GISTEQ PhotoTracker (stupidly) puts a bogus field in front > @@ -918,10 +920,12 @@ nmea_parse_one_line(char* ibuf) > tbuf += 4; > } > > - if (*tbuf != '$') { > - return; > + if ( NULL == (pPass = strchr(tbuf, '$')) ) { > + return; > } > > + tbuf = pPass; > + > ck = strrchr(tbuf, '*'); > if (ck != NULL) { > *ck = '\0'; > @@ -957,6 +961,7 @@ nmea_parse_one_line(char* ibuf) > */ > if (strstr(tbuf, ",,")) { > tbuf = gstrsub(tbuf, ",,", ",0,"); > + bNeedFree = 1; > } > > if (0 == strncmp(tbuf, "$GPWPL,", 7)) { > @@ -989,7 +994,7 @@ nmea_parse_one_line(char* ibuf) > amod_waypoint = 1; > } > > - if (tbuf != ibuf) { > + if (0 != bNeedFree) { > /* clear up the dynamic buffer we used because substition was > required */ > xfree(tbuf); > } > > Best Regards, > Kiselev Stanislav > sup...@gm... > aka 2:5020/2140.486 > > > ------------------------------------------------------------ > ------------------ > Subversion Kills Productivity. Get off Subversion & Make the Move to > Perforce. > With Perforce, you get hassle-free workflows. Merge that actually works. > Faster operations. Version large binaries. Built-in WAN optimization and > the > freedom to use Git, Perforce or both. Make the move to Perforce. > http://pubads.g.doubleclick.net/gampad/clk?id=122218951& > iu=/4140/ostg.clktrk > _______________________________________________ > Gpsbabel-code mailing list http://www.gpsbabel.org > Gps...@li... > https://lists.sourceforge.net/lists/listinfo/gpsbabel-code > |