Skip to content

Commit 680a4df

Browse files
Federico Frascarelliyulian-gaponenko
authored andcommitted
Quit the serialization when there is an object referencing itself in SmartModePdfObjectsSerializer
Test for the corresponding case was added to functional-tests repo: KERNEL_SmartMode_XObjectSelfReference#xObjectIterativeReference with input file name "checkboxes_XObject_iterative_reference.pdf". DEVSIX-2137
1 parent 3f9bf56 commit 680a4df

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/SmartModePdfObjectsSerializer.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,19 @@ public SerializedObjectContent serializeObject(PdfObject obj) {
8888
if (content == null) {
8989
ByteBuffer bb = new ByteBuffer();
9090
int level = 100;
91-
serObject(obj, bb, level, serializedCache);
91+
try {
92+
serObject(obj, bb, level, serializedCache);
93+
} catch (SelfReferenceException e) {
94+
return null;
95+
}
9296
content = bb.toByteArray();
9397
}
9498
return new SerializedObjectContent(content);
9599
}
96100

97-
private void serObject(PdfObject obj, ByteBuffer bb, int level, Map<PdfIndirectReference, byte[]> serializedCache) {
101+
private static class SelfReferenceException extends Exception{}
102+
103+
private void serObject(PdfObject obj, ByteBuffer bb, int level, Map<PdfIndirectReference, byte[]> serializedCache) throws SelfReferenceException {
98104
if (level <= 0) {
99105
return;
100106
}
@@ -112,6 +118,13 @@ private void serObject(PdfObject obj, ByteBuffer bb, int level, Map<PdfIndirectR
112118
bb.append(cached);
113119
return;
114120
} else {
121+
122+
if (serializedCache.keySet().contains(reference)) {
123+
//referencing itself
124+
throw new SelfReferenceException();
125+
}
126+
serializedCache.put(reference, null);
127+
115128
savedBb = bb;
116129
bb = new ByteBuffer();
117130
obj = reference.getRefersTo();
@@ -143,7 +156,7 @@ private void serObject(PdfObject obj, ByteBuffer bb, int level, Map<PdfIndirectR
143156
}
144157

145158
private void serDic(PdfDictionary dic, ByteBuffer bb, int level,
146-
Map<PdfIndirectReference, byte[]> serializedCache) {
159+
Map<PdfIndirectReference, byte[]> serializedCache) throws SelfReferenceException {
147160
bb.append("$D");
148161
if (level <= 0)
149162
return;
@@ -159,7 +172,7 @@ private void serDic(PdfDictionary dic, ByteBuffer bb, int level,
159172
}
160173

161174
private void serArray(PdfArray array, ByteBuffer bb, int level,
162-
Map<PdfIndirectReference, byte[]> serializedCache) {
175+
Map<PdfIndirectReference, byte[]> serializedCache) throws SelfReferenceException {
163176
bb.append("$A");
164177
if (level <= 0)
165178
return;

0 commit comments

Comments
 (0)