diff options
| author | 2014-09-09 05:09:47 +0000 | |
|---|---|---|
| committer | 2014-09-09 05:09:47 +0000 | |
| commit | 38510082135a7fb438afb515fa3174596e644e9b (patch) | |
| tree | 1713771d82e5dfd77fd41cdbb83133f6551ddfda | |
| parent | 9102fff43f52be08032b07e1e922dcdd3660f6b3 (diff) | |
| parent | 376fa68f02d1cd56e506533a3ad16de4de88271d (diff) | |
Merge "ART: Fix unchecked register index validity"
| -rw-r--r-- | runtime/verifier/method_verifier.cc | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index ef6b34322f..c21a7a43f9 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -3530,12 +3530,24 @@ void MethodVerifier::VerifyPrimitivePut(RegType& target_type, RegType& insn_type value_compatible = value_type.IsFloatTypes(); } else if (target_type.IsLong()) { instruction_compatible = insn_type.IsLong(); - RegType& value_type_hi = work_line_->GetRegisterType(vregA + 1); - value_compatible = value_type.IsLongTypes() && value_type.CheckWidePair(value_type_hi); + // Additional register check: this is not checked statically (as part of VerifyInstructions), + // as target_type depends on the resolved type of the field. + if (instruction_compatible && work_line_->NumRegs() > vregA + 1) { + RegType& value_type_hi = work_line_->GetRegisterType(vregA + 1); + value_compatible = value_type.IsLongTypes() && value_type.CheckWidePair(value_type_hi); + } else { + value_compatible = false; + } } else if (target_type.IsDouble()) { instruction_compatible = insn_type.IsLong(); // no put-double, so expect put-long - RegType& value_type_hi = work_line_->GetRegisterType(vregA + 1); - value_compatible = value_type.IsDoubleTypes() && value_type.CheckWidePair(value_type_hi); + // Additional register check: this is not checked statically (as part of VerifyInstructions), + // as target_type depends on the resolved type of the field. + if (instruction_compatible && work_line_->NumRegs() > vregA + 1) { + RegType& value_type_hi = work_line_->GetRegisterType(vregA + 1); + value_compatible = value_type.IsDoubleTypes() && value_type.CheckWidePair(value_type_hi); + } else { + value_compatible = false; + } } else { instruction_compatible = false; // reference with primitive store value_compatible = false; // unused |