On 08/15/2016 01:02 PM, Jakub Jelinek wrote:
> On Fri, Aug 12, 2016 at 02:22:56PM +0200, Martin Liška wrote:
>> Simple patch corrects assumption about string length, however the hunk in
>> save_string is kind of discussable as one can have a string with '\0' chars
>> which is length enough? 
>>
>> Thoughts?
>>
>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
>>
>> Ready to be installed?
>> Martin
> 
>> >From c7a7e1be3c113ee0f610d627426b8f241357b86e Mon Sep 17 00:00:00 2001
>> From: marxin <mli...@suse.cz>
>> Date: Tue, 9 Aug 2016 13:04:57 +0200
>> Subject: [PATCH] Fix invalid memory access in gcc.c (driver/72765)
>>
>> gcc/ChangeLog:
>>
>> 2016-08-09  Martin Liska  <mli...@suse.cz>
>>
>>      PR driver/72765
>>      * gcc.c (do_spec_1): Call save_string with the right size.
>>      (save_string): Do an assert about string we copy.
>> ---
>>  gcc/gcc.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/gcc/gcc.c b/gcc/gcc.c
>> index 7460f6a..a5c4a19 100644
>> --- a/gcc/gcc.c
>> +++ b/gcc/gcc.c
>> @@ -5420,8 +5420,9 @@ do_spec_1 (const char *spec, int inswitch, const char 
>> *soft_matched_part)
>>                      if (files_differ)
>>  #endif
>>                        {
>> -                        temp_filename = save_string (temp_filename,
>> -                                                     temp_filename_length + 
>> 1);
>> +                        temp_filename
>> +                          = save_string (temp_filename,
>> +                                         temp_filename_length - 1);
>>                          obstack_grow (&obstack, temp_filename,
>>                                                  temp_filename_length);
>>                          arg_going = 1;
> 
> This is ok for trunk/6.2 (if you commit RSN).

Ok, I'll commit the first hunk to both GCC-5 and GCC-6 branches.

> 
>> @@ -8362,6 +8363,7 @@ save_string (const char *s, int len)
>>  {
>>    char *result = XNEWVEC (char, len + 1);
>>  
>> +  gcc_assert (strlen (s) >= (unsigned int)len);
>>    memcpy (result, s, len);
>>    result[len] = 0;
>>    return result;
> 
> I'd leave this one out (at least from 6.x); if anything, use just
> gcc_checking_assert (since otherwise it doesn't make much sense to pass len
> if you are going to recompute it anyway) and put a space between the cast and 
> len.

And will commit checking assert for trunk.

Martin

> 
>       Jakub
> 

Reply via email to