@@ -22,7 +22,7 @@ use rustc::ty::subst::InternalSubsts;
22
22
use rustc_data_structures:: fx:: FxHashMap ;
23
23
use rustc_index:: vec:: IndexVec ;
24
24
use rustc:: ty:: layout:: {
25
- LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout ,
25
+ LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout , Size ,
26
26
} ;
27
27
28
28
use crate :: rustc:: ty:: subst:: Subst ;
@@ -35,6 +35,9 @@ use crate::interpret::{
35
35
use crate :: const_eval:: error_to_const_error;
36
36
use crate :: transform:: { MirPass , MirSource } ;
37
37
38
+ /// The maximum number of bytes that we'll allocate space for a return value.
39
+ const MAX_ALLOC_LIMIT : u64 = 1024 ;
40
+
38
41
pub struct ConstProp ;
39
42
40
43
impl < ' tcx > MirPass < ' tcx > for ConstProp {
@@ -313,8 +316,10 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
313
316
ecx
314
317
. layout_of ( body. return_ty ( ) . subst ( tcx, substs) )
315
318
. ok ( )
316
- // Don't bother allocating memory for ZST types which have no values.
317
- . filter ( |ret_layout| !ret_layout. is_zst ( ) )
319
+ // Don't bother allocating memory for ZST types which have no values
320
+ // or for large values.
321
+ . filter ( |ret_layout| !ret_layout. is_zst ( ) &&
322
+ ret_layout. size < Size :: from_bytes ( MAX_ALLOC_LIMIT ) )
318
323
. map ( |ret_layout| ecx. allocate ( ret_layout, MemoryKind :: Stack ) ) ;
319
324
320
325
ecx. push_stack_frame (
@@ -453,6 +458,11 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
453
458
) -> Option < ( ) > {
454
459
let span = source_info. span ;
455
460
461
+ // #66397: Don't try to eval into large places as that can cause an OOM
462
+ if place_layout. size >= Size :: from_bytes ( MAX_ALLOC_LIMIT ) {
463
+ return None ;
464
+ }
465
+
456
466
let overflow_check = self . tcx . sess . overflow_checks ( ) ;
457
467
458
468
// Perform any special handling for specific Rvalue types.
0 commit comments