middle-end/101292 - invalid memory access with warning control

The warning control falls into the C++ trap of using a reference
to old hashtable contents for a put operation which can end up
re-allocating that before reading from the old freed referenced to
source.  Fixed by introducing a temporary.

2022-01-17  Richard Biener  <rguenther@suse.de>

	PR middle-end/101292
	* diagnostic-spec.c (copy_warning): Make sure to not
	reference old hashtable content on possible resize.
	* warning-control.cc (copy_warning): Likewise.
This commit is contained in:
Richard Biener 2022-01-17 15:22:11 +01:00
parent deb9f18f67
commit 1374d4b963
2 changed files with 6 additions and 2 deletions

View File

@ -195,7 +195,10 @@ copy_warning (location_t to, location_t from)
else
{
if (from_spec)
nowarn_map->put (to, *from_spec);
{
nowarn_spec_t tem = *from_spec;
nowarn_map->put (to, tem);
}
else
nowarn_map->remove (to);
}

View File

@ -206,7 +206,8 @@ void copy_warning (ToType to, FromType from)
gcc_assert (supp);
gcc_checking_assert (nowarn_map);
nowarn_map->put (to_loc, *from_spec);
nowarn_spec_t tem = *from_spec;
nowarn_map->put (to_loc, tem);
}
else
{