diff mbox series

aarch64: fix use-after-free in -march=native (PR driver/89014)

Message ID 1548263557-42784-1-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series aarch64: fix use-after-free in -march=native (PR driver/89014) | expand

Commit Message

David Malcolm Jan. 23, 2019, 5:12 p.m. UTC
Running:
  $ valgrind ./xgcc -B. -c test.c -march=native
on aarch64 shows a use-after-free in host_detect_local_cpu due
to the std::string result of aarch64_get_extension_string_for_isa_flags
only living until immediately after a c_str call.

This leads to corrupt "-march=" values being passed to cc1.

This patch fixes the use-after-free, though it appears to also need
Tamar's patch here:
  https://gcc.gnu.org/ml/gcc-patches/2018-12/msg01302.html
in order to generate valid values for cc1.  This may have worked by
accident in the past, if the corrupt "-march=" value happened to be
0-terminated in the "right" place; with this patch it now appears
to reliably break without Tamar's patch.

Lightly tested: I've manually verified that this cleans up the valgrind
output for the driver, but I haven't bootstrapped with it.

OK for trunk?

gcc/ChangeLog:
	PR driver/89014
	* config/aarch64/driver-aarch64.c (host_detect_local_cpu): Fix
	use-after-free of the result of
	aarch64_get_extension_string_for_isa_flags.
---
 gcc/config/aarch64/driver-aarch64.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Comments

Richard Earnshaw (lists) Jan. 23, 2019, 4:27 p.m. UTC | #1
On 23/01/2019 17:12, David Malcolm wrote:
> Running:
>   $ valgrind ./xgcc -B. -c test.c -march=native
> on aarch64 shows a use-after-free in host_detect_local_cpu due
> to the std::string result of aarch64_get_extension_string_for_isa_flags
> only living until immediately after a c_str call.
> 
> This leads to corrupt "-march=" values being passed to cc1.
> 
> This patch fixes the use-after-free, though it appears to also need
> Tamar's patch here:
>   https://gcc.gnu.org/ml/gcc-patches/2018-12/msg01302.html
> in order to generate valid values for cc1.  This may have worked by
> accident in the past, if the corrupt "-march=" value happened to be
> 0-terminated in the "right" place; with this patch it now appears
> to reliably break without Tamar's patch.
> 
> Lightly tested: I've manually verified that this cleans up the valgrind
> output for the driver, but I haven't bootstrapped with it.
> 
> OK for trunk?
> 

OK.

R.

> gcc/ChangeLog:
> 	PR driver/89014
> 	* config/aarch64/driver-aarch64.c (host_detect_local_cpu): Fix
> 	use-after-free of the result of
> 	aarch64_get_extension_string_for_isa_flags.
> ---
>  gcc/config/aarch64/driver-aarch64.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/gcc/config/aarch64/driver-aarch64.c b/gcc/config/aarch64/driver-aarch64.c
> index 2bf1f9a..100e0c3 100644
> --- a/gcc/config/aarch64/driver-aarch64.c
> +++ b/gcc/config/aarch64/driver-aarch64.c
> @@ -178,7 +178,6 @@ host_detect_local_cpu (int argc, const char **argv)
>    unsigned int variants[2] = { ALL_VARIANTS, ALL_VARIANTS };
>    unsigned int n_variants = 0;
>    bool processed_exts = false;
> -  const char *ext_string = "";
>    unsigned long extension_flags = 0;
>    unsigned long default_flags = 0;
>  
> @@ -348,11 +347,12 @@ host_detect_local_cpu (int argc, const char **argv)
>    if (tune)
>      return res;
>  
> -  ext_string
> -    = aarch64_get_extension_string_for_isa_flags (extension_flags,
> -						  default_flags).c_str ();
> -
> -  res = concat (res, ext_string, NULL);
> +  {
> +    std::string extension
> +      = aarch64_get_extension_string_for_isa_flags (extension_flags,
> +						    default_flags);
> +    res = concat (res, extension.c_str (), NULL);
> +  }
>  
>    return res;
>  
>
diff mbox series

Patch

diff --git a/gcc/config/aarch64/driver-aarch64.c b/gcc/config/aarch64/driver-aarch64.c
index 2bf1f9a..100e0c3 100644
--- a/gcc/config/aarch64/driver-aarch64.c
+++ b/gcc/config/aarch64/driver-aarch64.c
@@ -178,7 +178,6 @@  host_detect_local_cpu (int argc, const char **argv)
   unsigned int variants[2] = { ALL_VARIANTS, ALL_VARIANTS };
   unsigned int n_variants = 0;
   bool processed_exts = false;
-  const char *ext_string = "";
   unsigned long extension_flags = 0;
   unsigned long default_flags = 0;
 
@@ -348,11 +347,12 @@  host_detect_local_cpu (int argc, const char **argv)
   if (tune)
     return res;
 
-  ext_string
-    = aarch64_get_extension_string_for_isa_flags (extension_flags,
-						  default_flags).c_str ();
-
-  res = concat (res, ext_string, NULL);
+  {
+    std::string extension
+      = aarch64_get_extension_string_for_isa_flags (extension_flags,
+						    default_flags);
+    res = concat (res, extension.c_str (), NULL);
+  }
 
   return res;