Skip to content

Commit

Permalink
feat: properly treat errors from recording out of bounds positions in…
Browse files Browse the repository at this point in the history
… very large files (#290)
  • Loading branch information
galkahana authored Dec 7, 2024
1 parent bc385d6 commit 015bd5e
Show file tree
Hide file tree
Showing 50 changed files with 1,169 additions and 482 deletions.
20 changes: 19 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,24 @@
"variant": "cpp",
"algorithm": "cpp",
"tiffio.h": "c",
"utility": "cpp"
"utility": "cpp",
"bit": "cpp",
"charconv": "cpp",
"format": "cpp",
"iterator": "cpp",
"xfacet": "cpp",
"xiosbase": "cpp",
"xlocale": "cpp",
"xlocbuf": "cpp",
"xlocinfo": "cpp",
"xlocmes": "cpp",
"xlocmon": "cpp",
"xlocnum": "cpp",
"xloctime": "cpp",
"xmemory": "cpp",
"xstring": "cpp",
"xtr1common": "cpp",
"xtree": "cpp",
"xutility": "cpp"
}
}
49 changes: 36 additions & 13 deletions PDFWriter/ANSIFontWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,20 @@ EStatusCode ANSIFontWriter::WriteFont( FreeTypeFaceWrapper& inFontInfo,
EStatusCode status = PDFHummus::eSuccess;
FontDescriptorWriter fontDescriptorWriter;

inObjectsContext->StartNewIndirectObject(inFontOccurrence->mWrittenObjectID);

mFontInfo = &inFontInfo;
mFontOccurrence = inFontOccurrence;
mObjectsContext = inObjectsContext;

do
{
status = inObjectsContext->StartNewIndirectObject(inFontOccurrence->mWrittenObjectID);
if(status != PDFHummus::eSuccess)
{
TRACE_LOG1("ANSIFontWriter::WriteFont, Failed to start indirect object for written font %ld", inFontOccurrence->mWrittenObjectID);
break;
}

mFontInfo = &inFontInfo;
mFontOccurrence = inFontOccurrence;
mObjectsContext = inObjectsContext;

DictionaryContext* fontContext = inObjectsContext->StartDictionary();

// Type
Expand Down Expand Up @@ -123,11 +129,17 @@ EStatusCode ANSIFontWriter::WriteFont( FreeTypeFaceWrapper& inFontInfo,
inObjectsContext->EndIndirectObject();

// if necessary, write a dictionary encoding
if(mDifferences.size() > 0)
WriteEncodingDictionary();
if(mDifferences.size() > 0) {
status = WriteEncodingDictionary();
if(status != PDFHummus::eSuccess)
{
TRACE_LOG("ANSIFontWriter::WriteFont, failed to write encoding dictionary");
break;
}
}

WriteToUnicodeMap(toUnicodeMapObjectID);
fontDescriptorWriter.WriteFontDescriptor(fontDescriptorObjectID,
status = fontDescriptorWriter.WriteFontDescriptor(fontDescriptorObjectID,
inSubsetFontName,
&inFontInfo,
mCharactersVector,
Expand Down Expand Up @@ -229,11 +241,16 @@ void ANSIFontWriter::WriteEncoding(DictionaryContext* inFontContext)

static const std::string scBaseEncoding = "BaseEncoding";
static const std::string scDifferences = "Differences";
void ANSIFontWriter::WriteEncodingDictionary()
EStatusCode ANSIFontWriter::WriteEncodingDictionary()
{
DictionaryContext* encodingDictionary;

mObjectsContext->StartNewIndirectObject(mEncodingDictionaryID);
EStatusCode status = mObjectsContext->StartNewIndirectObject(mEncodingDictionaryID);
if(status != eSuccess)
{
TRACE_LOG1("ANSIFontWriter::WriteEncodingDictionary, Unexpected Error. Unable to start indirect object for encoding dictionary %ld",mEncodingDictionaryID);
return status;
}
encodingDictionary = mObjectsContext->StartDictionary();

// Type
Expand Down Expand Up @@ -280,6 +297,7 @@ void ANSIFontWriter::WriteEncodingDictionary()

mObjectsContext->EndDictionary(encodingDictionary);
mObjectsContext->EndIndirectObject();
return status;
}

static const char* scCmapHeader =
Expand All @@ -300,9 +318,13 @@ static const std::string scEndBFChar = "endbfchar";
static const char* scCmapFooter = "endcmap CMapName currentdict /CMap defineresource pop end end\n";


void ANSIFontWriter::WriteToUnicodeMap(ObjectIDType inToUnicodeMap)
EStatusCode ANSIFontWriter::WriteToUnicodeMap(ObjectIDType inToUnicodeMap)
{
mObjectsContext->StartNewIndirectObject(inToUnicodeMap);
EStatusCode status = mObjectsContext->StartNewIndirectObject(inToUnicodeMap);
if(status != eSuccess) {
TRACE_LOG1("ANSIFontWriter::WriteToUnicodeMap, Unable to start indirect object for toUnicode map %ld",inToUnicodeMap);
return status;
}
PDFStream* pdfStream = mObjectsContext->StartPDFStream();
IByteWriter* cmapWriteContext = pdfStream->GetWriteStream();
PrimitiveObjectsWriter primitiveWriter(cmapWriteContext);
Expand Down Expand Up @@ -342,8 +364,9 @@ void ANSIFontWriter::WriteToUnicodeMap(ObjectIDType inToUnicodeMap)
}
primitiveWriter.WriteKeyword(scEndBFChar);
cmapWriteContext->Write((const Byte*)scCmapFooter,strlen(scCmapFooter));
mObjectsContext->EndPDFStream(pdfStream);
status = mObjectsContext->EndPDFStream(pdfStream);
delete pdfStream;
return status;
}

static const Byte scEntryEnding[2] = {'>','\n'};
Expand Down
4 changes: 2 additions & 2 deletions PDFWriter/ANSIFontWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ class ANSIFontWriter
void WriteWidths(DictionaryContext* inFontContext);
void CalculateDifferences();
void WriteEncoding(DictionaryContext* inFontContext);
void WriteEncodingDictionary();
void WriteToUnicodeMap(ObjectIDType inToUnicodeMap);
PDFHummus::EStatusCode WriteEncodingDictionary();
PDFHummus::EStatusCode WriteToUnicodeMap(ObjectIDType inToUnicodeMap);
void WriteGlyphEntry(IByteWriter* inWriter,unsigned short inEncodedCharacter,const ULongVector& inUnicodeValues);

FreeTypeFaceWrapper* mFontInfo;
Expand Down
Loading

0 comments on commit 015bd5e

Please sign in to comment.