MAINT-2124 Texture allocation issues

meow-7.2.2
andreykproductengine 2017-12-05 17:54:17 +02:00
parent a5cb8fdbee
commit 083b93d2f9
3 changed files with 57 additions and 27 deletions

View File

@ -374,19 +374,28 @@ bool LLImageJ2C::loadAndValidate(const std::string &filename)
else
{
U8 *data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), file_size);
apr_size_t bytes_read = file_size;
apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
infile.close() ;
if (s != APR_SUCCESS || (S32)bytes_read != file_size)
if (!data)
{
FREE_MEM(LLImageBase::getPrivatePool(), data);
setLastError("Unable to read entire file");
infile.close();
setLastError("Out of memory", filename);
res = false;
}
else
{
res = validate(data, file_size);
apr_size_t bytes_read = file_size;
apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
infile.close();
if (s != APR_SUCCESS || (S32)bytes_read != file_size)
{
FREE_MEM(LLImageBase::getPrivatePool(), data);
setLastError("Unable to read entire file");
res = false;
}
else
{
res = validate(data, file_size);
}
}
}

View File

@ -452,26 +452,37 @@ bool LLTextureCacheRemoteWorker::doRead()
size = llmin(size, mDataSize);
// Allocate the read buffer
mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), size);
S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,
mReadData, offset, size, mCache->getLocalAPRFilePool());
if (bytes_read != size)
if (mReadData)
{
LL_WARNS() << "LLTextureCacheWorker: " << mID
<< " incorrect number of bytes read from header: " << bytes_read
<< " / " << size << LL_ENDL;
FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
mDataSize = -1; // failed
done = true;
}
// If we already read all we expected, we're actually done
if (mDataSize <= bytes_read)
{
done = true;
S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,
mReadData, offset, size, mCache->getLocalAPRFilePool());
if (bytes_read != size)
{
LL_WARNS() << "LLTextureCacheWorker: " << mID
<< " incorrect number of bytes read from header: " << bytes_read
<< " / " << size << LL_ENDL;
FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
mReadData = NULL;
mDataSize = -1; // failed
done = true;
}
// If we already read all we expected, we're actually done
if (mDataSize <= bytes_read)
{
done = true;
}
else
{
mState = BODY;
}
}
else
{
mState = BODY;
LL_WARNS() << "LLTextureCacheWorker: " << mID
<< " failed to allocate memory for reading: " << mDataSize << LL_ENDL;
mReadData = NULL;
mDataSize = -1; // failed
done = true;
}
}

View File

@ -1781,7 +1781,17 @@ bool LLTextureFetchWorker::doWork(S32 param)
mRequestedSize -= src_offset; // Make requested values reflect useful part
mRequestedOffset += src_offset;
}
U8 * buffer = (U8 *)ALLOCATE_MEM(LLImageBase::getPrivatePool(), total_size);
if (!buffer)
{
// abort. If we have no space for packet, we have not enough space to decode image
setState(DONE);
LL_WARNS(LOG_TXT) << mID << " abort: out of memory" << LL_ENDL;
releaseHttpSemaphore();
return true;
}
if (mFormattedImage.isNull())
{
// For now, create formatted image based on extension
@ -1801,10 +1811,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
mFileSize = total_size + 1 ; //flag the file is not fully loaded.
}
U8 * buffer = (U8 *) ALLOCATE_MEM(LLImageBase::getPrivatePool(), total_size);
if (cur_size > 0)
{
// Copy previously collected data into buffer
memcpy(buffer, mFormattedImage->getData(), cur_size);
}
mHttpBufferArray->read(src_offset, (char *) buffer + cur_size, append_size);