mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 03:24:38 +02:00
7030388: JCK test failed to reject invalid class check01304m10n
Restrict fix for 7020118 to only when checking exception handlers Reviewed-by: dcubed, dholmes
This commit is contained in:
parent
cf3120dddc
commit
727612ede9
3 changed files with 11 additions and 5 deletions
|
@ -208,8 +208,10 @@ bool StackMapFrame::has_flag_match_exception(
|
|||
return true;
|
||||
}
|
||||
|
||||
bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const {
|
||||
if (_max_locals != target->max_locals() || _stack_size != target->stack_size()) {
|
||||
bool StackMapFrame::is_assignable_to(
|
||||
const StackMapFrame* target, bool is_exception_handler, TRAPS) const {
|
||||
if (_max_locals != target->max_locals() ||
|
||||
_stack_size != target->stack_size()) {
|
||||
return false;
|
||||
}
|
||||
// Only need to compare type elements up to target->locals() or target->stack().
|
||||
|
@ -222,7 +224,7 @@ bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const {
|
|||
bool match_flags = (_flags | target->flags()) == target->flags();
|
||||
|
||||
return match_locals && match_stack &&
|
||||
(match_flags || has_flag_match_exception(target));
|
||||
(match_flags || (is_exception_handler && has_flag_match_exception(target)));
|
||||
}
|
||||
|
||||
VerificationType StackMapFrame::pop_stack_ex(VerificationType type, TRAPS) {
|
||||
|
|
|
@ -134,7 +134,8 @@ class StackMapFrame : public ResourceObj {
|
|||
void copy_stack(const StackMapFrame* src);
|
||||
|
||||
// Return true if this stack map frame is assignable to target.
|
||||
bool is_assignable_to(const StackMapFrame* target, TRAPS) const;
|
||||
bool is_assignable_to(const StackMapFrame* target,
|
||||
bool is_exception_handler, TRAPS) const;
|
||||
|
||||
// Push type into stack type array.
|
||||
inline void push_stack(VerificationType type, TRAPS) {
|
||||
|
|
|
@ -98,10 +98,13 @@ bool StackMapTable::match_stackmap(
|
|||
bool result = true;
|
||||
StackMapFrame *stackmap_frame = _frame_array[frame_index];
|
||||
if (match) {
|
||||
// when checking handler target, match == true && update == false
|
||||
bool is_exception_handler = !update;
|
||||
// Has direct control flow from last instruction, need to match the two
|
||||
// frames.
|
||||
result = frame->is_assignable_to(
|
||||
stackmap_frame, CHECK_VERIFY_(frame->verifier(), false));
|
||||
stackmap_frame, is_exception_handler,
|
||||
CHECK_VERIFY_(frame->verifier(), false));
|
||||
}
|
||||
if (update) {
|
||||
// Use the frame in stackmap table as current frame
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue