From 5cd4fa548843e89525e48d6180ab6f3c5eb9833e Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 7 Oct 2023 22:12:43 +0000 Subject: [PATCH] Bug 66425: Avoid Exceptions found via oss-fuzz We try to avoid throwing ClassCastExceptions, but it was possible to trigger one here with a specially crafted input-file Should fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=62795 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1912796 13f79535-47bb-0310-9956-ffa450edef68 --- .../converter/TestExcelConverterSuite.java | 11 ++++++----- .../poi/hssf/model/InternalWorkbook.java | 6 +++++- .../poi/hssf/usermodel/HSSFShapeFactory.java | 6 +++++- .../LittleEndianByteArrayInputStream.java | 2 +- .../poi/hssf/dev/TestBiffDrawingToXml.java | 1 + .../poi/hssf/model/TestDrawingAggregate.java | 10 +++++++++- ...nimized-POIHSSFFuzzer-5436547081830400.xls | Bin 0 -> 47616 bytes test-data/spreadsheet/stress.xls | Bin 57344 -> 57856 bytes 8 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 test-data/spreadsheet/clusterfuzz-testcase-minimized-POIHSSFFuzzer-5436547081830400.xls diff --git a/poi-scratchpad/src/test/java/org/apache/poi/hssf/converter/TestExcelConverterSuite.java b/poi-scratchpad/src/test/java/org/apache/poi/hssf/converter/TestExcelConverterSuite.java index 927d54e88e..980e1298b8 100644 --- a/poi-scratchpad/src/test/java/org/apache/poi/hssf/converter/TestExcelConverterSuite.java +++ b/poi-scratchpad/src/test/java/org/apache/poi/hssf/converter/TestExcelConverterSuite.java @@ -38,15 +38,16 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -public class TestExcelConverterSuite -{ +public class TestExcelConverterSuite { /** * YK: a quick hack to exclude failing documents from the suite. */ - @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") private static final List failingFiles = Arrays.asList( - /* not failing, but requires more memory */ - "ex45698-22488.xls" ); + // not failing, but requires more memory + "ex45698-22488.xls", + // broken documents + "clusterfuzz-testcase-minimized-POIHSSFFuzzer-5436547081830400.xls" + ); public static Stream files() { List files = new ArrayList<>(); diff --git a/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java b/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java index acd3541cf7..a60fec9fd6 100644 --- a/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java +++ b/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java @@ -466,7 +466,11 @@ public final class InternalWorkbook { "There are only " + numfonts + " font records, but you asked for index " + idx); } - return ( FontRecord ) records.get((records.getFontpos() - (numfonts - 1)) + index); + Record record = records.get((records.getFontpos() - (numfonts - 1)) + index); + if (!(record instanceof FontRecord)) { + throw new IllegalStateException("Did not have the expected record-type FontRecord: " + record.getClass()); + } + return ( FontRecord ) record; } /** diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java index fff9250a68..080938367b 100644 --- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java +++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java @@ -51,7 +51,11 @@ public class HSSFShapeFactory { public static void createShapeTree(EscherContainerRecord container, EscherAggregate agg, HSSFShapeContainer out, DirectoryNode root) { if (container.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) { ObjRecord obj = null; - EscherClientDataRecord clientData = ((EscherContainerRecord) container.getChild(0)).getChildById(EscherClientDataRecord.RECORD_ID); + EscherRecord child = container.getChild(0); + if (!(child instanceof EscherContainerRecord)) { + throw new IllegalArgumentException("Had unexpected type of child: " + child.getClass()); + } + EscherClientDataRecord clientData = ((EscherContainerRecord) child).getChildById(EscherClientDataRecord.RECORD_ID); if (null != clientData) { obj = (ObjRecord) agg.getShapeToObjMapping().get(clientData); } diff --git a/poi/src/main/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java b/poi/src/main/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java index e5c0b259a0..2f7215b0bb 100644 --- a/poi/src/main/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java +++ b/poi/src/main/java/org/apache/poi/util/LittleEndianByteArrayInputStream.java @@ -87,7 +87,7 @@ public class LittleEndianByteArrayInputStream extends ByteArrayInputStream imple public void setReadIndex(int pos) { if (pos < 0 || pos >= count) { - throw new IndexOutOfBoundsException(); + throw new IndexOutOfBoundsException("Invalid position: " + pos + " with count " + count); } this.pos = pos; } diff --git a/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java b/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java index ea39f5147d..a87f34aad8 100644 --- a/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java +++ b/poi/src/test/java/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java @@ -55,6 +55,7 @@ class TestBiffDrawingToXml extends BaseTestIteratingXLS { excludes.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); excludes.put("protected_66115.xls", EncryptedDocumentException.class); excludes.put("clusterfuzz-testcase-minimized-POIHSSFFuzzer-5285517825277952.xls", IllegalArgumentException.class); + excludes.put("clusterfuzz-testcase-minimized-POIHSSFFuzzer-5436547081830400.xls", IllegalArgumentException.class); return excludes; } diff --git a/poi/src/test/java/org/apache/poi/hssf/model/TestDrawingAggregate.java b/poi/src/test/java/org/apache/poi/hssf/model/TestDrawingAggregate.java index 9a3bd3d649..e21e359767 100644 --- a/poi/src/test/java/org/apache/poi/hssf/model/TestDrawingAggregate.java +++ b/poi/src/test/java/org/apache/poi/hssf/model/TestDrawingAggregate.java @@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayInputStream; @@ -163,6 +164,12 @@ class TestDrawingAggregate { DrawingAggregateInfo info = DrawingAggregateInfo.get(sheet); if(info != null) { aggs.put(i, info); + if (file.getName().equals("clusterfuzz-testcase-minimized-POIHSSFFuzzer-5436547081830400.xls")) { + assertThrows(IllegalArgumentException.class, + sheet::getDrawingPatriarch); + return; + } + HSSFPatriarch p = sheet.getDrawingPatriarch(); // compare aggregate.serialize() with raw bytes from the record stream @@ -172,7 +179,8 @@ class TestDrawingAggregate { byte[] dgBytes2 = agg.serialize(); assertEquals(dgBytes1.length, dgBytes2.length, "different size of raw data ande aggregate.serialize()"); - assertArrayEquals(dgBytes1, dgBytes2, "raw drawing data (" + dgBytes1.length + " bytes) and aggregate.serialize() are different."); + assertArrayEquals(dgBytes1, dgBytes2, + "raw drawing data (" + dgBytes1.length + " bytes) and aggregate.serialize() are different."); } } diff --git a/test-data/spreadsheet/clusterfuzz-testcase-minimized-POIHSSFFuzzer-5436547081830400.xls b/test-data/spreadsheet/clusterfuzz-testcase-minimized-POIHSSFFuzzer-5436547081830400.xls new file mode 100644 index 0000000000000000000000000000000000000000..d8c01148ff155da1aa1cc39dc4d09fa5c9fef141 GIT binary patch literal 47616 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 X8z79KWC){Dpl0$osKMV$2LJy7HD==b literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/stress.xls b/test-data/spreadsheet/stress.xls index ce88487bdbf21ca5d361e6e6f78193a977874981..edc99459a8dd7b3dcd83516156044b99c3d60a02 100644 GIT binary patch delta 3278 zcmZ9OZBSHI7{|}qH&+BM0=njUXTlFn&N{Z}B49!wVzL1)2nYxWf?dHCFx1pi$d^nb zLyr}`Xq3IGz3679F^YnXuG;u+4NTLw%n$7DOw&x3(sR!~yUV%k@WAuGzx#X6x%ciu zN1wi9K;LDLX(sp;M~M4a#wz`URS-NH85s$Ex2XNzqMYM~CiA2}7pZs@$=y)DqIGR! zOLN-}5=Zu*WLu*Igd@MU)ktxfVp|i>+9T&4Uf0Bv^Axhorjf(Voq9@K#y@42r^NGlDBQX-^#))B{iI_-_HF6xr z(;joMC%Rab^GsWkTf^*~20F}=IuodmS3j=-&$1K$8rmPi1sVp_LJBD%!HzP$fDp$p~)_-%TaGLore5g3A$2`Qgo_Q4gf5C@*)gZ*3DNeZfcVYLr7ZXrq- zQ`Ih1`(V?-1^5NEpR3Jyj$c)iv1s;(&3ebz=x*Z|a0=7(Cwru5n961K3zVq#mVq8a8A9#7P1r_X2D?&I`*Bj(keFP zTtqQeP(*P>H7cS6MHDWh6&y9JbChG8;834V3t5H^^}S``50bi-XmtDzj#~ELC`XLo zP~RaIQiqOM!4ZoN*Lf>l&fMoCdyxbOd?0|M9vyLlBMu#X;Amh&qa5P}M?80|Ku5gb zh)0LL-%6in`TbTobXyVxMJYgq%-b*$@RDqYVmLVa=HrBu3srCqYo zjjRFcCe{V@CDse|Wp)qhW|ru+Nn3C?Holv7R_K+b4$P)ww#h5gS6H{#Mz^v7IAV`dL#(4B$%Ylo|%K9Zq_GMVpw2eQcmo2+5s!x`?_tH{p8S$i(a(oW1~ zVRrhmth|PqLvT7YPW4S>A-j-G5!e(BJDan+k)4gRGOx(e>zJit)^tTyIx$NVoM{?o zI(NQ-Y`VavYuGuQ-Gl5LoHY#d-^A=`%qCxzl`hQY3eLG2X9jofMK(iVGc;@_XZInS ziL(w~l_iGRGr`Q`y?Q{W?8h)mkY;J5*&UcZ`71&%2yMVLrA-e!)ZMiN>?_>5XW{0oK$_JP&6r2k+&OGis zfNY+?=4n_bXAdIl#91?L$kKQ5+ zXTL_a5@!v={BJN@irM7bvhpovRf4lh~hY2kL>c${5!IA60`cy{5w10-*r9k5a{r~Ggfui zef$@Pe!Q9|+X=~npB-y*YAGukOkm}M(dP3{T3iqQ{*|&MLn7-K{0si(t{d8>J9X3Z IV92EZA1cOVnE(I) delta 2515 zcmZ9NZBSHI7{|}qU2sF-@>1f!+)4Y;jIL8iBCIQh7MR4Mpu8$5poXAAz7$$2YGyA~ z$YWN7WYCMHm3q@@nqm+^90av|0}Q_PP5sn36Jy%5hd*s+_s%{u=Xajx_rLe5{4rDJp<*0N{u3qeG4H0RzkPxS>=&<>zwvh=|p7)l`vX%q|#m0&uF=>Jjp*-4{AjIm4LQH4T zzyzx|w@B{t<~-)JiXGe``Dl&wuWiC621ER7yRZxI|JDxS5Z)*K`#~Z|c(+aZ&lfC$ zMQfaYpHD-!I>*++7Vhh_+Vay%tmHGd9aR6zt?)a12HYg>@F68N4L)ui{M9X|4w`<8 z^rcSpuld4dt97@%&1Pir^gn!ue2N&cn2wyCCYMm}S(nVFdt7tqiB6YXN?BZ&(e_T4 zI~NndY9f&*ee=P5;V~kQ_uAFUE@Js`s6D<2-pi+v&N!Jzqn&Z?0yvzS!>Ku(eCzy< zN0g(Gvd;M&mFMEzMR0^@ju6ceqB;0?njIKC$2^`^?BV2QYYYsy>R#J;{{LGG3a71X12+a|pIU<##l)}4x=P|uI&Rqsa zl;()i98sDhS~<#Tr*brLT}@}YljIt@+wGETDfYZezC`I)F<*1ZG~NPB0&8aWHdr#)1dth_HYA>6f_rX%MoRol^c`D}v^v=Wl6?Qg&Jv+v%`1hO;uLaEy2wI?m2)zr&dK<5r#zCOxpq#<%L$K$;3a*--LttrIOj=UpTz?|1iPZQW8EoV_cPKL_)6ulXkUv*G*3=SoRp>mGAw@4#>$-Ic@08 z!F&fhzW`ebcAMFkV9UTJ-!MI2f#qsBxdAzOD(7qT=3&0(hG`rH%Li*__6=A8*agn{ z7OYUqDGbOdQaQ)aTZH*3H%;R>*mAH;X5WFW0IR)edcFrM)^dsia!ORr59lqy{1tYd z09y%m|Krfvl=-}Xb zYH-Y=c!%TE&@6kTjW?3{o66t1(m#cy?BQrC7!GxYT$-}~?|XxiraB&_y5Yb0A7kst NUfb^9tkIER`@bjr1?2z$ -- 2.39.5