11e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang/* 21e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Copyright 2012, The Android Open Source Project 31e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * 41e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 51e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * you may not use this file except in compliance with the License. 61e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * You may obtain a copy of the License at 71e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * 81e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 91e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * 101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * Unless required by applicable law or agreed to in writing, software 111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * See the License for the specific language governing permissions and 141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang * limitations under the License. 151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang */ 161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang//===----------------------------------------------------------------------===// 181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// This file implements RSInfo::ReadFromFile() 191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang//===----------------------------------------------------------------------===// 201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 21e198abec6c5e3eab380ccf6897b0a0b9c2dd92ddStephen Hines#include "bcc/Renderscript/RSInfo.h" 221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <new> 241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#include <utils/FileMap.h> 261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 27ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h" 28c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Support/InputFile.h" 291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changusing namespace bcc; 311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changnamespace { 331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename ItemType, typename ItemContainer> 351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline bool helper_read_list_item(const ItemType &pItem, 361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ItemContainer &pResult); 381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Process PragmaItem in the file 401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_read_list_item<rsinfo::PragmaItem, RSInfo::PragmaListTy>( 421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::PragmaItem &pItem, 431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::PragmaListTy &pResult) 451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ 461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *key = pInfo.getStringFromPool(pItem.key); 471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *value =pInfo.getStringFromPool(pItem.value); 481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (key == NULL) { 501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid string index %d for key in RS pragma list.", pItem.key); 511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (value == NULL) { 551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid string index %d for value in RS pragma list.", pItem.value); 561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.push(std::make_pair(key, value)); 601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Procee ObjectSlotItem in the file 641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_read_list_item<rsinfo::ObjectSlotItem, RSInfo::ObjectSlotListTy>( 661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::ObjectSlotItem &pItem, 671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::ObjectSlotListTy &pResult) 691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ 701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.push(pItem.slot); 711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Procee ExportVarNameItem in the file 751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_read_list_item<rsinfo::ExportVarNameItem, RSInfo::ExportVarNameListTy>( 771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::ExportVarNameItem &pItem, 781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::ExportVarNameListTy &pResult) 801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ 811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *name = pInfo.getStringFromPool(pItem.name); 821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (name == NULL) { 841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid string index %d for name in RS export vars.", pItem.name); 851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.push(name); 891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Procee ExportFuncNameItem in the file 931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_read_list_item<rsinfo::ExportFuncNameItem, RSInfo::ExportFuncNameListTy>( 951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::ExportFuncNameItem &pItem, 961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::ExportFuncNameListTy &pResult) 981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ 991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *name = pInfo.getStringFromPool(pItem.name); 1001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (name == NULL) { 1021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid string index %d for name in RS export funcs.", pItem.name); 1031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.push(name); 1071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang// Procee ExportForeachFuncItem in the file 1111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<> inline bool 1121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changhelper_read_list_item<rsinfo::ExportForeachFuncItem, RSInfo::ExportForeachFuncListTy>( 1131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::ExportForeachFuncItem &pItem, 1141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 1151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo::ExportForeachFuncListTy &pResult) 1161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang{ 1171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *name = pInfo.getStringFromPool(pItem.name); 1181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (name == NULL) { 1201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid string index %d for name in RS export foreachs.", pItem.name); 1211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pResult.push(std::make_pair(name, pItem.signature)); 1251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changtemplate<typename ItemType, typename ItemContainer> 1291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changinline bool helper_read_list(const uint8_t *pData, 1301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const RSInfo &pInfo, 1311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::ListHeader &pHeader, 1321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ItemContainer &pResult) { 1331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const ItemType *item; 1341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Out-of-range exception has been checked. 1361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang for (uint32_t i = 0; i < pHeader.count; i++) { 1371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang item = reinterpret_cast<const ItemType *>(pData + 1381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pHeader.offset + 1391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang i * pHeader.itemSize); 1401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_read_list_item<ItemType, ItemContainer>(*item, pInfo, pResult)) { 1411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return false; 1421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return true; 1451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} 1461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // end anonymous namespace 1481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 149c5e607adff80a66bc5420baffd299862abdf368dJean-Luc BrouilletRSInfo *RSInfo::ReadFromFile(InputFile &pInput) { 1501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang android::FileMap *map = NULL; 1511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSInfo *result = NULL; 1521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const uint8_t *data; 1531e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const rsinfo::Header *header; 1541e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang size_t filesize; 1551e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const char *input_filename = pInput.getName().c_str(); 1561e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang const off_t cur_input_offset = pInput.tell(); 1571e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1581e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pInput.hasError()) { 1591e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Invalid RS info file %s! (%s)", input_filename, 1601e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang pInput.getErrorMessage().c_str()); 1611e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 1621e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1631e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1641e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang filesize = pInput.getSize(); 1651e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (pInput.hasError()) { 1661e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Failed to get the size of RS info file %s! (%s)", 1671e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang input_filename, pInput.getErrorMessage().c_str()); 1681e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 1691e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Create memory map for the file. 1721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang map = pInput.createMap(/* pOffset */cur_input_offset, 1731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang /* pLength */filesize - cur_input_offset); 1741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (map == NULL) { 1751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Failed to map RS info file %s to the memory! (%s)", 1761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang input_filename, pInput.getErrorMessage().c_str()); 1771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 1781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang data = reinterpret_cast<const uint8_t *>(map->getDataPtr()); 1811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Header starts at the beginning of the file. 1831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang header = reinterpret_cast<const rsinfo::Header *>(data); 1841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Check the magic. 1861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (::memcmp(header->magic, RSINFO_MAGIC, sizeof(header->magic)) != 0) { 1871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGV("Wrong magic found in the RS info file %s. Treat it as a dirty " 1881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang "cache.", input_filename); 1891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 1901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 1911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 1921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Check the version. 1931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (::memcmp(header->version, 1941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang RSINFO_VERSION, 1953cd3ec8f9d30d219cecd30ce8b221241a79a74d9Jean-Luc Brouillet sizeof(header->version)) != 0) { 1961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGV("Mismatch the version of RS info file %s: (current) %s v.s. (file) " 1971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang "%s. Treat it as as a dirty cache.", input_filename, RSINFO_VERSION, 1981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang header->version); 1991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Check the size. 2031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if ((header->headerSize != sizeof(rsinfo::Header)) || 2041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (header->pragmaList.itemSize != sizeof(rsinfo::PragmaItem)) || 2051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (header->objectSlotList.itemSize != sizeof(rsinfo::ObjectSlotItem)) || 2061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (header->exportVarNameList.itemSize != sizeof(rsinfo::ExportVarNameItem)) || 2071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (header->exportFuncNameList.itemSize != sizeof(rsinfo::ExportFuncNameItem)) || 2081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (header->exportForeachFuncList.itemSize != sizeof(rsinfo::ExportForeachFuncItem))) { 2091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGW("Corrupted RS info file %s! (unexpected size found)", input_filename); 2101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2111e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2121e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2131e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Check the range. 2141e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#define LIST_DATA_RANGE(_list_header) \ 2151e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ((_list_header).offset + (_list_header).count * (_list_header).itemSize) 2161e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (((header->headerSize + header->strPoolSize) > filesize) || 2171e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (LIST_DATA_RANGE(header->pragmaList) > filesize) || 2181e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (LIST_DATA_RANGE(header->objectSlotList) > filesize) || 2191e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (LIST_DATA_RANGE(header->exportVarNameList) > filesize) || 2201e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (LIST_DATA_RANGE(header->exportFuncNameList) > filesize) || 2211e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (LIST_DATA_RANGE(header->exportForeachFuncList) > filesize)) { 2221e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGW("Corrupted RS info file %s! (data out of the range)", input_filename); 2231e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2241e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2251e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang#undef LIST_DATA_RANGE 2261e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2271e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // File seems ok, create result RSInfo object. 2281e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang result = new (std::nothrow) RSInfo(header->strPoolSize); 2291e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (result == NULL) { 2301e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Out of memory when create RSInfo object for %s!", input_filename); 2311e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2321e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2331e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2341e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Make advice on our access pattern. 2351e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang map->advise(android::FileMap::SEQUENTIAL); 2361e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2371e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Copy the header. 2381e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ::memcpy(&result->mHeader, header, sizeof(rsinfo::Header)); 2391e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2401e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (header->strPoolSize > 0) { 2411e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Copy the string pool. The string pool is immediately after the header at 2421e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // the offset header->headerSize. 2431e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (result->mStringPool == NULL) { 2441e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ALOGE("Out of memory when allocate string pool for RS info file %s!", 2451e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang input_filename); 2461e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2471e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2481e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang ::memcpy(result->mStringPool, data + result->mHeader.headerSize, 2491e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang result->mHeader.strPoolSize); 2501e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2511e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2521e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Populate all the data to the result object. 253c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet result->mSourceHash = 254c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet reinterpret_cast<const uint8_t*>(result->getStringFromPool(header->sourceSha1Idx)); 255c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet if (result->mSourceHash == NULL) { 256c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet ALOGE("Invalid string index %d for SHA-1 checksum of source.", header->sourceSha1Idx); 257f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet goto bail; 258f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet } 259f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet 260f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet result->mCompileCommandLine = result->getStringFromPool(header->compileCommandLineIdx); 261f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet if (result->mCompileCommandLine == NULL) { 262f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet ALOGE("Invalid string index %d for compile command line.", header->compileCommandLineIdx); 263f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet goto bail; 264f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet } 265f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet 266f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet result->mBuildFingerprint = result->getStringFromPool(header->buildFingerprintIdx); 267f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet if (result->mBuildFingerprint == NULL) { 268f2ac3176c351cd80bce77fe1488f3de2d0789c1bJean-Luc Brouillet ALOGE("Invalid string index %d for build fingerprint.", header->buildFingerprintIdx); 269c5e607adff80a66bc5420baffd299862abdf368dJean-Luc Brouillet goto bail; 2701e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2711e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2721e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_read_list<rsinfo::PragmaItem, PragmaListTy> 2731e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (data, *result, header->pragmaList, result->mPragmas)) { 2741e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2751e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2761e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2771e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_read_list<rsinfo::ObjectSlotItem, ObjectSlotListTy> 2781e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (data, *result, header->objectSlotList, result->mObjectSlots)) { 2791e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2801e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2811e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2821e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_read_list<rsinfo::ExportVarNameItem, ExportVarNameListTy> 2831e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (data, *result, header->exportVarNameList, result->mExportVarNames)) { 2841e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2851e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2861e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2871e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_read_list<rsinfo::ExportFuncNameItem, ExportFuncNameListTy> 2881e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (data, *result, header->exportFuncNameList, result->mExportFuncNames)) { 2891e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2901e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2911e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2921e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (!helper_read_list<rsinfo::ExportForeachFuncItem, ExportForeachFuncListTy> 2931e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang (data, *result, header->exportForeachFuncList, result->mExportForeachFuncs)) { 2941e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang goto bail; 2951e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 2961e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 2971e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang // Clean up. 2981e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang map->release(); 2991e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 3001e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return result; 3011e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 3021e2adce6df4414d827149ec563c9c89f21ea7426Zonr Changbail: 3031e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang if (map != NULL) { 3041e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang map->release(); 3051e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang } 3061e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 3071e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang delete result; 3081e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang 3091e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang return NULL; 3101e2adce6df4414d827149ec563c9c89f21ea7426Zonr Chang} // RSInfo::ReadFromFile 311