1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Functions for interpreting LEB128 (little endian base 128) values 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Leb128.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads an unsigned LEB128 value, updating the given pointer to point 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * just past the end of the read value and also indicating whether the 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * value was syntactically valid. The only syntactically *invalid* 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values are ones that are five bytes long where the final byte has 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * any but the low-order four bits set. Additionally, if the limit is 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed as non-NULL and bytes would need to be read past the limit, 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * then the read is considered invalid. 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint readAndVerifyUnsignedLeb128(const u1** pStream, const u1* limit, 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool* okay) { 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* ptr = *pStream; 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int result = readUnsignedLeb128(pStream); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((limit != NULL) && (*pStream > limit)) 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project || (((*pStream - ptr) == 5) && (ptr[4] > 0x0f))) { 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *okay = false; 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Reads a signed LEB128 value, updating the given pointer to point 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * just past the end of the read value and also indicating whether the 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * value was syntactically valid. The only syntactically *invalid* 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values are ones that are five bytes long where the final byte has 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * any but the low-order four bits set. Additionally, if the limit is 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed as non-NULL and bytes would need to be read past the limit, 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * then the read is considered invalid. 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint readAndVerifySignedLeb128(const u1** pStream, const u1* limit, 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool* okay) { 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u1* ptr = *pStream; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int result = readSignedLeb128(pStream); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (((limit != NULL) && (*pStream > limit)) 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project || (((*pStream - ptr) == 5) && (ptr[4] > 0x0f))) { 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *okay = false; 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 66