Fix CStream::ReadOffset

This commit is contained in:
Svetlana Kulikova
2025-06-06 11:29:46 +03:00
parent 646bbd405f
commit a006479964
3 changed files with 32 additions and 35 deletions

View File

@ -931,8 +931,7 @@ namespace PdfWriter
FreeData();
mCFFOffset = inCFFFile->Tell();
mPrimitivesReader = new CMemoryStream(inCFFFile->Size() - inCFFFile->Tell());
mPrimitivesReader->Write(inCFFFile->GetCurBuffer(), inCFFFile->Size() - inCFFFile->Tell());
mPrimitivesReader = new CMemoryStream(inCFFFile->GetCurBuffer(), inCFFFile->Size() - inCFFFile->Tell());
mPrimitivesReader->Seek(0, SeekSet);
bool status = ReadHeader();
@ -1057,7 +1056,7 @@ namespace PdfWriter
mTopDictIndex = new TopDictInfo[dictionariesCount];
for (unsigned short i = 0; i < dictionariesCount && status == true; ++i)
status = ReadDict(offsets[i+1] - offsets[i], mTopDictIndex[i].mTopDict);
status = ReadDict(offsets[i + 1] - offsets[i], mTopDictIndex[i].mTopDict);
delete[] offsets;
if (!status)
@ -1940,8 +1939,7 @@ namespace PdfWriter
FreeTables();
mPrimitivesReader = new CMemoryStream(nDataLength);
mPrimitivesReader->Write(pData, nDataLength);
mPrimitivesReader = new CMemoryStream(pData, nDataLength);
mPrimitivesReader->Seek(0, SeekSet);
mHeaderOffset = mPrimitivesReader->Tell();

View File

@ -149,36 +149,14 @@ namespace PdfWriter
unsigned int CStream::ReadOffset(BYTE nOffset)
{
unsigned int nRes = 0;
switch (nOffset)
if (nOffset < 1 || nOffset > 4)
return nRes;
for (BYTE i = 0; i < nOffset; ++i)
{
case 1:
{
nRes = ReadUChar();
break;
}
case 2:
{
nRes = ReadUShort();
break;
}
case 3:
{
if (!CheckSize(3))
return 0;
BYTE nChar;
unsigned int unBytesRead = 1;
BYTE nChar0, nChar1, nChar2;
Read(&nChar0, &unBytesRead);
Read(&nChar1, &unBytesRead);
Read(&nChar2, &unBytesRead);
nRes = (unsigned int)(((unsigned int)nChar0 << 16) | ((unsigned int)nChar1 << 8) | nChar2);
break;
}
case 4:
{
nRes = ReadUInt();
break;
}
default: break;
Read(&nChar, &unBytesRead);
nRes = (nRes << 8) | nChar;
}
return nRes;
}
@ -777,6 +755,7 @@ namespace PdfWriter
//----------------------------------------------------------------------------------------
CMemoryStream::CMemoryStream()
{
m_bFree = true;
m_unSize = 0;
m_nBufferSize = 0;
m_pBuffer = NULL;
@ -784,6 +763,7 @@ namespace PdfWriter
}
CMemoryStream::CMemoryStream(unsigned int unBufferSize)
{
m_bFree = true;
m_unSize = 0;
m_nBufferSize = 0;
m_pBuffer = NULL;
@ -791,9 +771,26 @@ namespace PdfWriter
Shrink(unBufferSize);
}
CMemoryStream::CMemoryStream(BYTE* pBuffer, unsigned int unSize, bool bFree)
{
m_bFree = bFree;
m_unSize = unSize;
m_nBufferSize = unSize;
m_pBuffer = pBuffer;
m_pCur = pBuffer;
}
CMemoryStream::~CMemoryStream()
{
Close();
if (m_pBuffer && m_bFree)
{
free(m_pBuffer);
//delete[] m_pBuffer;
}
m_nBufferSize = 0;
m_pBuffer = NULL;
m_pCur = NULL;
m_unSize = 0;
}
bool CMemoryStream::IsEof()
{
@ -839,7 +836,7 @@ namespace PdfWriter
}
void CMemoryStream::Close()
{
if (m_pBuffer)
if (m_pBuffer && m_bFree)
{
free(m_pBuffer);
//delete[] m_pBuffer;

View File

@ -150,6 +150,7 @@ namespace PdfWriter
CMemoryStream();
CMemoryStream(unsigned int unBufferSize);
CMemoryStream(BYTE* pBuffer, unsigned int unSize, bool bFree = false);
~CMemoryStream();
bool IsEof();
void Write(const BYTE* pBuffer, unsigned int unSize);
@ -171,6 +172,7 @@ namespace PdfWriter
void Shrink(unsigned int unSize);
private:
bool m_bFree;
BYTE* m_pBuffer;
int m_nBufferSize;