diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 05b86d55961a1a1bab3fdb3e0603469838267109..1c90d01b5dc785bd2d721f2e6714be339e89de57 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1404,18 +1404,21 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) } aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo)); } + + entries.resize(num_entries); + size_t total_entries_size = sizeof(Entry) * num_entries; + size_t bytes_read = aprfile->read((void*)entries.data(), total_entries_size); + if (bytes_read != total_entries_size) + { + LL_WARNS() << "Corrupted header entries, expected " << total_entries_size << " bytes but got " << bytes_read << " bytes" << LL_ENDL; + closeHeaderEntriesFile(); + purgeAllTextures(false); + return 0; + } + for (U32 idx=0; idx<num_entries; idx++) { - Entry entry; - S32 bytes_read = aprfile->read((void*)(&entry), (S32)sizeof(Entry)); - if (bytes_read < sizeof(Entry)) - { - LL_WARNS() << "Corrupted header entries, failed at " << idx << " / " << num_entries << LL_ENDL; - closeHeaderEntriesFile(); - purgeAllTextures(false); - return 0; - } - entries.push_back(entry); + const Entry& entry = entries[idx]; // LL_INFOS() << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << LL_ENDL; if(entry.mImageSize > entry.mBodySize) { @@ -1434,20 +1437,18 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries) void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries) { - S32 num_entries = entries.size(); + size_t num_entries = entries.size(); llassert_always(num_entries == mHeaderEntriesInfo.mEntries); if (!mReadOnly) { LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo)); - for (S32 idx=0; idx<num_entries; idx++) + size_t write_size = size_t(sizeof(Entry)) * num_entries; + size_t bytes_written = aprfile->write((void*) (entries.data()), write_size); + if (bytes_written != write_size) { - S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry)); - if(bytes_written != sizeof(Entry)) - { - clearCorruptedCache() ; //clear the cache. - return ; - } + clearCorruptedCache(); //clear the cache. + return; } closeHeaderEntriesFile(); } @@ -1573,9 +1574,9 @@ void LLTextureCache::readHeaderCache() { S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE); - for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter) + for (const auto& lru_pair : lru) { - mLRU.insert(entries[iter->second].mID); + mLRU.insert(entries[lru_pair.second].mID); // LL_INFOS() << "LRU: " << iter->first << " : " << iter->second << LL_ENDL; if (--lru_entries <= 0) break; @@ -1585,10 +1586,10 @@ void LLTextureCache::readHeaderCache() if (purge_list.size() > 0) { LLTimer timer; - for (std::set<U32>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) + for (U32 idx : purge_list) { - std::string tex_filename = getTextureFileName(entries[*iter].mID); - removeEntry((S32)*iter, entries[*iter], tex_filename); + std::string tex_filename = getTextureFileName(entries[idx].mID); + removeEntry((S32)idx, entries[idx], tex_filename); //make sure that pruning entries doesn't take too much time if (timer.getElapsedTimeF32() > TEXTURE_PRUNING_MAX_TIME)