[GNC-dev] gnucash maint: Bug 796982 - Import Bills & Invoices: change in un_escape() routine...

Geert Janssens geert.gnucash at kobaltwit.be
Wed Dec 19 10:23:28 EST 2018


Op woensdag 19 december 2018 15:55:17 CET schreef John Ralls:
> > On Dec 19, 2018, at 2:04 AM, Geert Janssens <geert.gnucash at 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 <jralls at 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




More information about the gnucash-devel mailing list