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

Geert Janssens geert.gnucash at kobaltwit.be
Wed Dec 19 05:04:24 EST 2018


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;

Geert




More information about the gnucash-devel mailing list