[GNC-dev] gnucash maint: Bug 796982 - Import Bills & Invoices: change in un_escape() routine...
John Ralls
jralls at ceridwen.us
Wed Dec 19 09:55:17 EST 2018
> 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. I considered a for-loop instead, I’ll revisit that as less ugly than checking tmpstr twice.
Regards,
John Ralls
More information about the gnucash-devel
mailing list