dex_file_verifier.h revision 0ba238dcc21ae3544e1e8cb5d108725db8a1c134
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ART_RUNTIME_DEX_FILE_VERIFIER_H_ 18#define ART_RUNTIME_DEX_FILE_VERIFIER_H_ 19 20#include <unordered_set> 21 22#include "dex_file.h" 23#include "safe_map.h" 24 25namespace art { 26 27class DexFileVerifier { 28 public: 29 static bool Verify(const DexFile* dex_file, const byte* begin, size_t size, 30 const char* location, std::string* error_msg); 31 32 const std::string& FailureReason() const { 33 return failure_reason_; 34 } 35 36 private: 37 DexFileVerifier(const DexFile* dex_file, const byte* begin, size_t size, const char* location) 38 : dex_file_(dex_file), begin_(begin), size_(size), location_(location), 39 header_(&dex_file->GetHeader()), ptr_(NULL), previous_item_(NULL) { 40 } 41 42 bool Verify(); 43 44 bool CheckShortyDescriptorMatch(char shorty_char, const char* descriptor, bool is_return_type); 45 bool CheckListSize(const void* start, size_t count, size_t element_size, const char* label); 46 bool CheckIndex(uint32_t field, uint32_t limit, const char* label); 47 48 bool CheckHeader(); 49 bool CheckMap(); 50 51 uint32_t ReadUnsignedLittleEndian(uint32_t size); 52 bool CheckAndGetHandlerOffsets(const DexFile::CodeItem* code_item, 53 uint32_t* handler_offsets, uint32_t handlers_size); 54 bool CheckClassDataItemField(uint32_t idx, uint32_t access_flags, bool expect_static); 55 bool CheckClassDataItemMethod(uint32_t idx, uint32_t access_flags, uint32_t code_offset, 56 bool expect_direct); 57 bool CheckPadding(size_t offset, uint32_t aligned_offset); 58 bool CheckEncodedValue(); 59 bool CheckEncodedArray(); 60 bool CheckEncodedAnnotation(); 61 62 bool CheckIntraClassDataItem(); 63 bool CheckIntraCodeItem(); 64 bool CheckIntraStringDataItem(); 65 bool CheckIntraDebugInfoItem(); 66 bool CheckIntraAnnotationItem(); 67 bool CheckIntraAnnotationsDirectoryItem(); 68 69 bool CheckIntraSectionIterate(size_t offset, uint32_t count, uint16_t type); 70 bool CheckIntraIdSection(size_t offset, uint32_t count, uint16_t type); 71 bool CheckIntraDataSection(size_t offset, uint32_t count, uint16_t type); 72 bool CheckIntraSection(); 73 74 bool CheckOffsetToTypeMap(size_t offset, uint16_t type); 75 76 // Note: as sometimes kDexNoIndex16, being 0xFFFF, is a valid return value, we need an 77 // additional out parameter to signal any errors loading an index. 78 uint16_t FindFirstClassDataDefiner(const byte* ptr, bool* success); 79 uint16_t FindFirstAnnotationsDirectoryDefiner(const byte* ptr, bool* success); 80 81 bool CheckInterStringIdItem(); 82 bool CheckInterTypeIdItem(); 83 bool CheckInterProtoIdItem(); 84 bool CheckInterFieldIdItem(); 85 bool CheckInterMethodIdItem(); 86 bool CheckInterClassDefItem(); 87 bool CheckInterAnnotationSetRefList(); 88 bool CheckInterAnnotationSetItem(); 89 bool CheckInterClassDataItem(); 90 bool CheckInterAnnotationsDirectoryItem(); 91 92 bool CheckInterSectionIterate(size_t offset, uint32_t count, uint16_t type); 93 bool CheckInterSection(); 94 95 // Load a string by (type) index. Checks whether the index is in bounds, printing the error if 96 // not. If there is an error, nullptr is returned. 97 const char* CheckLoadStringByIdx(uint32_t idx, const char* error_fmt); 98 const char* CheckLoadStringByTypeIdx(uint32_t type_idx, const char* error_fmt); 99 100 // Load a field/method Id by index. Checks whether the index is in bounds, printing the error if 101 // not. If there is an error, nullptr is returned. 102 const DexFile::FieldId* CheckLoadFieldId(uint32_t idx, const char* error_fmt); 103 const DexFile::MethodId* CheckLoadMethodId(uint32_t idx, const char* error_fmt); 104 105 void ErrorStringPrintf(const char* fmt, ...) 106 __attribute__((__format__(__printf__, 2, 3))) COLD_ATTR; 107 108 const DexFile* const dex_file_; 109 const byte* const begin_; 110 const size_t size_; 111 const char* const location_; 112 const DexFile::Header* const header_; 113 114 SafeMap<uint32_t, uint16_t> offset_to_type_map_; 115 const byte* ptr_; 116 const void* previous_item_; 117 118 std::string failure_reason_; 119 120 // Set of type ids for which there are ClassDef elements in the dex file. 121 std::unordered_set<decltype(DexFile::ClassDef::class_idx_)> defined_classes_; 122}; 123 124} // namespace art 125 126#endif // ART_RUNTIME_DEX_FILE_VERIFIER_H_ 127