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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StackMapFrame::is_assignable_to(const StackMapFrame* target, TRAPS) const {
|
bool StackMapFrame::is_assignable_to(
|
||||||
if (_max_locals != target->max_locals() || _stack_size != target->stack_size()) {
|
const StackMapFrame* target, bool is_exception_handler, TRAPS) const {
|
||||||
|
if (_max_locals != target->max_locals() ||
|
||||||
|
_stack_size != target->stack_size()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Only need to compare type elements up to target->locals() or target->stack().
|
// 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();
|
bool match_flags = (_flags | target->flags()) == target->flags();
|
||||||
|
|
||||||
return match_locals && match_stack &&
|
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) {
|
VerificationType StackMapFrame::pop_stack_ex(VerificationType type, TRAPS) {
|
||||||
|
|
|
@ -134,7 +134,8 @@ class StackMapFrame : public ResourceObj {
|
||||||
void copy_stack(const StackMapFrame* src);
|
void copy_stack(const StackMapFrame* src);
|
||||||
|
|
||||||
// Return true if this stack map frame is assignable to target.
|
// 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.
|
// Push type into stack type array.
|
||||||
inline void push_stack(VerificationType type, TRAPS) {
|
inline void push_stack(VerificationType type, TRAPS) {
|
||||||
|
|
|
@ -98,10 +98,13 @@ bool StackMapTable::match_stackmap(
|
||||||
bool result = true;
|
bool result = true;
|
||||||
StackMapFrame *stackmap_frame = _frame_array[frame_index];
|
StackMapFrame *stackmap_frame = _frame_array[frame_index];
|
||||||
if (match) {
|
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
|
// Has direct control flow from last instruction, need to match the two
|
||||||
// frames.
|
// frames.
|
||||||
result = frame->is_assignable_to(
|
result = frame->is_assignable_to(
|
||||||
stackmap_frame, CHECK_VERIFY_(frame->verifier(), false));
|
stackmap_frame, is_exception_handler,
|
||||||
|
CHECK_VERIFY_(frame->verifier(), false));
|
||||||
}
|
}
|
||||||
if (update) {
|
if (update) {
|
||||||
// Use the frame in stackmap table as current frame
|
// Use the frame in stackmap table as current frame
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue