Re: [PATCH v2 4/5] msi: Don't reimplement record formatting.

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 4/5] msi: Don't reimplement record formatting.

Hans Leidekker-4
On Sun, 2017-06-18 at 21:53 -0500, Zebediah Figura wrote:

> diff --git a/dlls/msi/package.c b/dlls/msi/package.c
> index eae01e0..f16b1dc 100644
> --- a/dlls/msi/package.c
> +++ b/dlls/msi/package.c
> @@ -1709,8 +1709,8 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
>      static const WCHAR szSetProgress[] = {'S','e','t','P','r','o','g','r','e','s','s',0};
>      static const WCHAR szActionText[] = {'A','c','t','i','o','n','T','e','x','t',0};
>      MSIRECORD *uirow;
> -    LPWSTR deformated, message;
> -    DWORD i, len, total_len, log_type = 0;
> +    LPWSTR deformated, message = {0};
> +    DWORD len, log_type = 0;
>      INT rc = 0;
>      char *msg;
>  
> @@ -1776,39 +1776,10 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
>      }
>      else
>      {
> -        static const WCHAR format[] = {'%','u',':',' ',0};
> -        UINT count = MSI_RecordGetFieldCount( record );
> -        WCHAR *p;
> -
> -        total_len = 1;
> -        for (i = 1; i <= count; i++)
> -        {
> -            len = 0;
> -            MSI_RecordGetStringW( record, i, NULL, &len );
> -            total_len += len + 13;
> -        }
> -        p = message = msi_alloc( total_len * sizeof(WCHAR) );
> -        if (!p) return ERROR_OUTOFMEMORY;
> -
> -        for (i = 1; i <= count; i++)
> -        {
> -            if (count > 1)
> -            {
> -                len = sprintfW( p, format, i );
> -                total_len -= len;
> -                p += len;
> -            }
> -            len = total_len;
> -            MSI_RecordGetStringW( record, i, p, &len );
> -            total_len -= len;
> -            p += len;
> -            if (count > 1 && total_len)
> -            {
> -                *p++ = ' ';
> -                total_len--;
> -            }
> -        }
> -        p[0] = 0;
> +        MSI_FormatRecordW(package, record, message, &len);
> +        len++;
> +        message = msi_alloc(len * sizeof(WCHAR));
> +        MSI_FormatRecordW(package, record, message, &len);

You can pass a NULL buffer in the size query. Please keep the check for
allocation failure. I would check the first call to MSI_FormatRecordW
too since the record is passed by the caller.




Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v2 4/5] msi: Don't reimplement record formatting.

Zebediah Figura
On 06/19/2017 04:45 AM, Hans Leidekker wrote:

> On Sun, 2017-06-18 at 21:53 -0500, Zebediah Figura wrote:
>> diff --git a/dlls/msi/package.c b/dlls/msi/package.c
>> index eae01e0..f16b1dc 100644
>> --- a/dlls/msi/package.c
>> +++ b/dlls/msi/package.c
>> @@ -1709,8 +1709,8 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
>>       static const WCHAR szSetProgress[] = {'S','e','t','P','r','o','g','r','e','s','s',0};
>>       static const WCHAR szActionText[] = {'A','c','t','i','o','n','T','e','x','t',0};
>>       MSIRECORD *uirow;
>> -    LPWSTR deformated, message;
>> -    DWORD i, len, total_len, log_type = 0;
>> +    LPWSTR deformated, message = {0};
>> +    DWORD len, log_type = 0;
>>       INT rc = 0;
>>       char *msg;
>>  
>> @@ -1776,39 +1776,10 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
>>       }
>>       else
>>       {
>> -        static const WCHAR format[] = {'%','u',':',' ',0};
>> -        UINT count = MSI_RecordGetFieldCount( record );
>> -        WCHAR *p;
>> -
>> -        total_len = 1;
>> -        for (i = 1; i <= count; i++)
>> -        {
>> -            len = 0;
>> -            MSI_RecordGetStringW( record, i, NULL, &len );
>> -            total_len += len + 13;
>> -        }
>> -        p = message = msi_alloc( total_len * sizeof(WCHAR) );
>> -        if (!p) return ERROR_OUTOFMEMORY;
>> -
>> -        for (i = 1; i <= count; i++)
>> -        {
>> -            if (count > 1)
>> -            {
>> -                len = sprintfW( p, format, i );
>> -                total_len -= len;
>> -                p += len;
>> -            }
>> -            len = total_len;
>> -            MSI_RecordGetStringW( record, i, p, &len );
>> -            total_len -= len;
>> -            p += len;
>> -            if (count > 1 && total_len)
>> -            {
>> -                *p++ = ' ';
>> -                total_len--;
>> -            }
>> -        }
>> -        p[0] = 0;
>> +        MSI_FormatRecordW(package, record, message, &len);
>> +        len++;
>> +        message = msi_alloc(len * sizeof(WCHAR));
>> +        MSI_FormatRecordW(package, record, message, &len);
>
> You can pass a NULL buffer in the size query. Please keep the check for
> allocation failure. I would check the first call to MSI_FormatRecordW
> too since the record is passed by the caller.
>
>

I'll send an updated patch.