Op woensdag 19 december 2018 15:55:17 CET schreef John Ralls: > > On Dec 19, 2018, at 2:04 AM, Geert Janssens <geert.gnuc...@kobaltwit.be> > > wrote:> > > Op woensdag 19 december 2018 06:32:16 CET schreef John Ralls: > >> Updated via https://github.com/Gnucash/gnucash/commit/f2976420 (commit) > >> > >> from https://github.com/Gnucash/gnucash/commit/2524482b (commit) > >> > >> commit f29764202ec9f7ace6eb726c246799cb19ad5c1a > >> Author: John Ralls <jra...@ceridwen.us> > >> Date: Tue Dec 18 21:29:53 2018 -0800 > >> > >> Bug 796982 - Import Bills & Invoices: change in un_escape() routine... > >> > >> causes description and notes fields to be mangled. > >> > >> Simple error, but rewrote the function to be more idiomatic, resisting > >> temptation to abuse the ternary operator. > >> > >> diff --git a/gnucash/import-export/bi-import/dialog-bi-import.c > >> b/gnucash/import-export/bi-import/dialog-bi-import.c index > >> 5b46e84..6aabcc3 > >> 100644 > >> --- a/gnucash/import-export/bi-import/dialog-bi-import.c > >> +++ b/gnucash/import-export/bi-import/dialog-bi-import.c > >> @@ -876,30 +876,26 @@ gnc_bi_import_create_bis (GtkListStore * store, > >> QofBook * book, * @param char* String to be modified > >> > >> * @return char* Modified string. > >> > >> */ > >> -static char * un_escape(char *str) > >> +static char* > >> +un_escape(char *str) > >> { > >> > >> gchar quote = '"'; > >> gchar *newStr = NULL, *tmpstr = str; > >> int n = 0; > >> > >> + > >> > >> newStr = g_malloc(strlen(str)+1); // This must be freed in the > >> calling > >> > >> code. while(*tmpstr != '\0') > >> > >> { > >> > >> if(*tmpstr == quote) > >> > >> - { > >> - tmpstr++; > >> - if(*tmpstr == quote) > >> - { > >> - newStr[n] = quote; > >> - } > >> - } > >> + // We always want the character after a quote. > >> + newStr[n] = *(++tmpstr); > >> > >> else > >> > >> - { > >> - newStr[n] = *str; > >> - } > >> - tmpstr++; > >> - n++; > >> + newStr[n] = *tmpstr; > >> + ++tmpstr; > >> + ++n; > >> > >> } > >> > >> + > >> > >> g_free (str); > >> > >> - newStr[n] = '\0'; //ending the character array > >> + newStr[n] = '\0'; //ending the character array > >> > >> return newStr; > >> > >> } > > > > Won't this introduce a read-past-end-of-string in case the last character > > of the string is a quote ? > > > > As far as I understand that would make > > newStr[n] = '\0' > > and tmpstr will be increased twice before it's reevaluated, effectively > > moving it past the final '\0': > > Once in > > newStr[n] = *(++tmpstr); > > and a second time in > > ++tmpstr; > > Good point, though it’s also true of the original. Ah, indeed, I see that too now.
> I considered a for-loop > instead, I’ll revisit that as less ugly than checking tmpstr twice. Ok. Geert _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel