11/*
2- * Copyright (c) 2008, 2018 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2008, 2020 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
@@ -57,21 +57,14 @@ bool frame::safe_for_sender(JavaThread *thread) {
5757 address fp = (address)_fp;
5858 address unextended_sp = (address)_unextended_sp;
5959
60- static size_t stack_guard_size = os::uses_stack_guard_pages () ?
61- (JavaThread::stack_red_zone_size () + JavaThread::stack_yellow_zone_size ()) : 0 ;
62- size_t usable_stack_size = thread->stack_size () - stack_guard_size;
63-
60+ // consider stack guards when trying to determine "safe" stack pointers
6461 // sp must be within the usable part of the stack (not in guards)
65- bool sp_safe = (sp != NULL &&
66- (sp <= thread->stack_base ()) &&
67- (sp >= thread->stack_base () - usable_stack_size));
68-
69- if (!sp_safe) {
62+ if (!thread->is_in_usable_stack (sp)) {
7063 return false ;
7164 }
7265
7366 bool unextended_sp_safe = (unextended_sp != NULL &&
74- (unextended_sp <= thread->stack_base ()) &&
67+ (unextended_sp < thread->stack_base ()) &&
7568 (unextended_sp >= sp));
7669 if (!unextended_sp_safe) {
7770 return false ;
@@ -80,7 +73,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
8073 // We know sp/unextended_sp are safe. Only fp is questionable here.
8174
8275 bool fp_safe = (fp != NULL &&
83- (fp <= thread->stack_base ()) &&
76+ (fp < thread->stack_base ()) &&
8477 fp >= sp);
8578
8679 if (_cb != NULL ) {
@@ -148,7 +141,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
148141 // is really a frame pointer.
149142
150143 intptr_t *saved_fp = (intptr_t *)*(sender_sp - frame::sender_sp_offset + link_offset);
151- bool saved_fp_safe = ((address)saved_fp <= thread->stack_base ()) && (saved_fp > sender_sp);
144+ bool saved_fp_safe = ((address)saved_fp < thread->stack_base ()) && (saved_fp > sender_sp);
152145
153146 if (!saved_fp_safe) {
154147 return false ;
@@ -178,7 +171,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
178171 // Could be the call_stub
179172 if (StubRoutines::returns_to_call_stub (sender_pc)) {
180173 intptr_t *saved_fp = (intptr_t *)*(sender_sp - frame::sender_sp_offset + link_offset);
181- bool saved_fp_safe = ((address)saved_fp <= thread->stack_base ()) && (saved_fp >= sender_sp);
174+ bool saved_fp_safe = ((address)saved_fp < thread->stack_base ()) && (saved_fp > sender_sp);
182175
183176 if (!saved_fp_safe) {
184177 return false ;
@@ -191,7 +184,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
191184 // Validate the JavaCallWrapper an entry frame must have
192185 address jcw = (address)sender.entry_frame_call_wrapper ();
193186
194- bool jcw_safe = (jcw <= thread->stack_base ()) && (jcw > (address)sender.fp ());
187+ bool jcw_safe = (jcw < thread->stack_base ()) && (jcw > (address)sender.fp ());
195188
196189 return jcw_safe;
197190 }
@@ -501,7 +494,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
501494
502495 address locals = (address) *interpreter_frame_locals_addr ();
503496
504- if (locals > thread->stack_base () || locals < (address) fp ()) return false ;
497+ if (locals >= thread->stack_base () || locals < (address) fp ()) return false ;
505498
506499 // We'd have to be pretty unlucky to be mislead at this point
507500
0 commit comments