diff options
author | Kees Cook <keescook@chromium.org> | 2016-10-18 18:08:04 -0400 |
---|---|---|
committer | Kees Cook <keescook@chromium.org> | 2016-10-31 14:30:41 -0400 |
commit | 58bea4144d235cee5bb51203b032ddafd6d1cf8d (patch) | |
tree | 01256e5ed4f34f736e83b841ca5ef9893cc479f8 | |
parent | da7389ac6c83e7aa8b04ebe5ba546df2a7873c5c (diff) |
latent_entropy: Fix wrong gcc code generation with 64 bit variables
The stack frame size could grow too large when the plugin used long long
on 32-bit architectures when the given function had too many basic blocks.
The gcc warning was:
drivers/pci/hotplug/ibmphp_ebda.c: In function 'ibmphp_access_ebda':
drivers/pci/hotplug/ibmphp_ebda.c:409:1: warning: the frame size of 1108 bytes is larger than 1024 bytes [-Wframe-larger-than=]
This switches latent_entropy from u64 to unsigned long.
Thanks to PaX Team and Emese Revfy for the patch.
Signed-off-by: Kees Cook <keescook@chromium.org>
-rw-r--r-- | mm/page_alloc.c | 2 | ||||
-rw-r--r-- | scripts/gcc-plugins/latent_entropy_plugin.c | 19 |
2 files changed, 10 insertions, 11 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 2b3bf6767d54..1b10c14de5db 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -92,7 +92,7 @@ int _node_numa_mem_[MAX_NUMNODES]; | |||
92 | #endif | 92 | #endif |
93 | 93 | ||
94 | #ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY | 94 | #ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY |
95 | volatile u64 latent_entropy __latent_entropy; | 95 | volatile unsigned long latent_entropy __latent_entropy; |
96 | EXPORT_SYMBOL(latent_entropy); | 96 | EXPORT_SYMBOL(latent_entropy); |
97 | #endif | 97 | #endif |
98 | 98 | ||
diff --git a/scripts/gcc-plugins/latent_entropy_plugin.c b/scripts/gcc-plugins/latent_entropy_plugin.c index 9d3d4adf3be8..8160f1c1b56e 100644 --- a/scripts/gcc-plugins/latent_entropy_plugin.c +++ b/scripts/gcc-plugins/latent_entropy_plugin.c | |||
@@ -340,7 +340,7 @@ static enum tree_code get_op(tree *rhs) | |||
340 | break; | 340 | break; |
341 | } | 341 | } |
342 | if (rhs) | 342 | if (rhs) |
343 | *rhs = build_int_cstu(unsigned_intDI_type_node, random_const); | 343 | *rhs = build_int_cstu(long_unsigned_type_node, random_const); |
344 | return op; | 344 | return op; |
345 | } | 345 | } |
346 | 346 | ||
@@ -372,7 +372,7 @@ static void __perturb_latent_entropy(gimple_stmt_iterator *gsi, | |||
372 | enum tree_code op; | 372 | enum tree_code op; |
373 | 373 | ||
374 | /* 1. create temporary copy of latent_entropy */ | 374 | /* 1. create temporary copy of latent_entropy */ |
375 | temp = create_var(unsigned_intDI_type_node, "tmp_latent_entropy"); | 375 | temp = create_var(long_unsigned_type_node, "temp_latent_entropy"); |
376 | 376 | ||
377 | /* 2. read... */ | 377 | /* 2. read... */ |
378 | add_referenced_var(latent_entropy_decl); | 378 | add_referenced_var(latent_entropy_decl); |
@@ -459,13 +459,13 @@ static void init_local_entropy(basic_block bb, tree local_entropy) | |||
459 | gsi_insert_before(&gsi, call, GSI_NEW_STMT); | 459 | gsi_insert_before(&gsi, call, GSI_NEW_STMT); |
460 | update_stmt(call); | 460 | update_stmt(call); |
461 | 461 | ||
462 | udi_frame_addr = fold_convert(unsigned_intDI_type_node, frame_addr); | 462 | udi_frame_addr = fold_convert(long_unsigned_type_node, frame_addr); |
463 | assign = gimple_build_assign(local_entropy, udi_frame_addr); | 463 | assign = gimple_build_assign(local_entropy, udi_frame_addr); |
464 | gsi_insert_after(&gsi, assign, GSI_NEW_STMT); | 464 | gsi_insert_after(&gsi, assign, GSI_NEW_STMT); |
465 | update_stmt(assign); | 465 | update_stmt(assign); |
466 | 466 | ||
467 | /* 3. create temporary copy of latent_entropy */ | 467 | /* 3. create temporary copy of latent_entropy */ |
468 | tmp = create_var(unsigned_intDI_type_node, "tmp_latent_entropy"); | 468 | tmp = create_var(long_unsigned_type_node, "temp_latent_entropy"); |
469 | 469 | ||
470 | /* 4. read the global entropy variable into local entropy */ | 470 | /* 4. read the global entropy variable into local entropy */ |
471 | add_referenced_var(latent_entropy_decl); | 471 | add_referenced_var(latent_entropy_decl); |
@@ -480,7 +480,7 @@ static void init_local_entropy(basic_block bb, tree local_entropy) | |||
480 | update_stmt(assign); | 480 | update_stmt(assign); |
481 | 481 | ||
482 | rand_cst = get_random_const(); | 482 | rand_cst = get_random_const(); |
483 | rand_const = build_int_cstu(unsigned_intDI_type_node, rand_cst); | 483 | rand_const = build_int_cstu(long_unsigned_type_node, rand_cst); |
484 | op = get_op(NULL); | 484 | op = get_op(NULL); |
485 | assign = create_assign(op, local_entropy, local_entropy, rand_const); | 485 | assign = create_assign(op, local_entropy, local_entropy, rand_const); |
486 | gsi_insert_after(&gsi, assign, GSI_NEW_STMT); | 486 | gsi_insert_after(&gsi, assign, GSI_NEW_STMT); |
@@ -529,7 +529,7 @@ static unsigned int latent_entropy_execute(void) | |||
529 | } | 529 | } |
530 | 530 | ||
531 | /* 1. create the local entropy variable */ | 531 | /* 1. create the local entropy variable */ |
532 | local_entropy = create_var(unsigned_intDI_type_node, "local_entropy"); | 532 | local_entropy = create_var(long_unsigned_type_node, "local_entropy"); |
533 | 533 | ||
534 | /* 2. initialize the local entropy variable */ | 534 | /* 2. initialize the local entropy variable */ |
535 | init_local_entropy(bb, local_entropy); | 535 | init_local_entropy(bb, local_entropy); |
@@ -561,10 +561,9 @@ static void latent_entropy_start_unit(void *gcc_data __unused, | |||
561 | if (in_lto_p) | 561 | if (in_lto_p) |
562 | return; | 562 | return; |
563 | 563 | ||
564 | /* extern volatile u64 latent_entropy */ | 564 | /* extern volatile unsigned long latent_entropy */ |
565 | gcc_assert(TYPE_PRECISION(long_long_unsigned_type_node) == 64); | 565 | quals = TYPE_QUALS(long_unsigned_type_node) | TYPE_QUAL_VOLATILE; |
566 | quals = TYPE_QUALS(long_long_unsigned_type_node) | TYPE_QUAL_VOLATILE; | 566 | type = build_qualified_type(long_unsigned_type_node, quals); |
567 | type = build_qualified_type(long_long_unsigned_type_node, quals); | ||
568 | id = get_identifier("latent_entropy"); | 567 | id = get_identifier("latent_entropy"); |
569 | latent_entropy_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL, id, type); | 568 | latent_entropy_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL, id, type); |
570 | 569 | ||