From c1f52674fd3f111b2514c41ce64d5226bb8a48ef Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sat, 11 Jan 2025 09:23:29 +0000 Subject: [PATCH] Bug 69315: HSMF: At least continue processing properties after multivalued properties Currently processing stops at multivalued properties. This at least continues processing, so other properties are processed properly. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1923051 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hsmf/datatypes/PropertiesChunk.java | 8 +++- .../java/org/apache/poi/hsmf/TestBasics.java | 38 +++++++++++++++++- test-data/poifs/MailSentPropertyMultiple.msg | Bin 0 -> 22528 bytes test-data/spreadsheet/stress.xls | Bin 70656 -> 70656 bytes 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test-data/poifs/MailSentPropertyMultiple.msg diff --git a/poi-scratchpad/src/main/java/org/apache/poi/hsmf/datatypes/PropertiesChunk.java b/poi-scratchpad/src/main/java/org/apache/poi/hsmf/datatypes/PropertiesChunk.java index 91692e3897..7b037f3e5b 100644 --- a/poi-scratchpad/src/main/java/org/apache/poi/hsmf/datatypes/PropertiesChunk.java +++ b/poi-scratchpad/src/main/java/org/apache/poi/hsmf/datatypes/PropertiesChunk.java @@ -209,6 +209,12 @@ public abstract class PropertiesChunk extends Chunk { int id = LittleEndian.readUShort(value); long flags = LittleEndian.readUInt(value); + boolean multivalued = false; + if ((typeID & Types.MULTIVALUED_FLAG) != 0) { + typeID -= Types.MULTIVALUED_FLAG; + multivalued = true; + } + // Turn the Type and ID into helper objects MAPIType type = Types.getById(typeID); MAPIProperty prop = MAPIProperty.get(id); @@ -255,7 +261,7 @@ public abstract class PropertiesChunk extends Chunk { // to another chunk which holds the data itself boolean isPointer = false; int length = type.getLength(); - if (type.isPointer()) { + if (type.isPointer() || multivalued) { isPointer = true; length = 8; } diff --git a/poi-scratchpad/src/test/java/org/apache/poi/hsmf/TestBasics.java b/poi-scratchpad/src/test/java/org/apache/poi/hsmf/TestBasics.java index 83f59bd789..49dea29aff 100644 --- a/poi-scratchpad/src/test/java/org/apache/poi/hsmf/TestBasics.java +++ b/poi-scratchpad/src/test/java/org/apache/poi/hsmf/TestBasics.java @@ -19,13 +19,20 @@ package org.apache.poi.hsmf; import static org.apache.poi.POITestCase.assertContains; import static org.apache.poi.POITestCase.assertStartsWith; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; import org.apache.poi.POIDataSamples; import org.apache.poi.hsmf.datatypes.AttachmentChunks; +import org.apache.poi.hsmf.datatypes.Chunks; import org.apache.poi.hsmf.datatypes.DirectoryChunk; +import org.apache.poi.hsmf.datatypes.MAPIProperty; import org.apache.poi.hsmf.exceptions.ChunkNotFoundException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -273,4 +280,33 @@ public final class TestBasics { } } } + + @Test + void testBug69315() throws Exception { + POIDataSamples testData = POIDataSamples.getPOIFSInstance(); + try (MAPIMessage mapi = new MAPIMessage(testData.openResourceAsStream("MailSentPropertyMultiple.msg"))) { + assertNotNull(mapi.getAttachmentFiles()); + assertNotNull(mapi.getDisplayBCC()); + assertNotNull(mapi.getMessageDate()); + + Chunks chunks = mapi.getMainChunks(); + assertNotNull(chunks); + assertNotNull(chunks.getRawProperties()); + assertNotNull(chunks.getRawProperties().get(MAPIProperty.CLIENT_SUBMIT_TIME)); + + AttachmentChunks[] attachments = mapi.getAttachmentFiles(); + for (AttachmentChunks attachment : attachments) { + DirectoryChunk chunkDirectory = attachment.getAttachmentDirectory(); + if (chunkDirectory != null) { + MAPIMessage attachmentMSG = chunkDirectory.getAsEmbeddedMessage(); + assertNotNull(attachmentMSG); + String body = attachmentMSG.getTextBody(); + assertNotNull(body); + } + } + + assertNull(mapi.getSummaryInformation()); + assertNull(mapi.getDocumentSummaryInformation()); + } + } } diff --git a/test-data/poifs/MailSentPropertyMultiple.msg b/test-data/poifs/MailSentPropertyMultiple.msg new file mode 100644 index 0000000000000000000000000000000000000000..d07feb178e0c450c5fd7b80351ce9a7248588bc7 GIT binary patch literal 22528 zcmeHP32>Chm3}jW5Mn?F65=p;#3dj$Vnz~&3(Ekz+!9 zB;@iYX6ne<0-nC82u;2H3{?W`> zGk^ccRZgnhs-B+r_v`*%zwUnB{r(=EemU>#qtA>#CrM#}1mx1?EEyX2+!yyK zKLpYXKIh4hXcejO=K;4u`03t$Vi!hbh*q06;hZgsa*Rd#5z6NyrA!%!ob#E8!w|C& zha(0NM<9+w%tp*Xgb9#5#8HR^h_nNvky4g1QF;s@{eC^tbGal&KT zv){%{IP%DbO@&Q|O7=Zl+}%NbvuHvD^UEDRpI zaPo_JZ&h7f@}r8vP)oyXxAJX0cl@Ecc+-mSuQ)jQm-p9y#f?8Xe;Zc6Zn;gi;Ir)t zTB6#+hYykS#z~#$RgxK|y_I*LJ+Vd3_^M=B0v(X|b2L9%ARzB4?K}&}$Z~$~%{D7W zNQPvSE=S}#8j^t0d}e5W0`2z&vnf{z;)BI6?(_RzZzoL~{VUKRSZC6-;Vi!t!-6zz zJL#aTolBbSVhG4bi%I{t5eIap)}I%n=W2b*to&m%-=RZT(^!71=28BMDsMkssrgQO zf>NJ=UnN6LeKq4QK6>djUqF7Q?Q!G_icjTt@B-pbphME7^*eY$DGbNA&+ofc^QoU} zX1=&DAOS636s<5QLzH�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 literal 0 HcmV?d00001 diff --git a/test-data/spreadsheet/stress.xls b/test-data/spreadsheet/stress.xls index 1667a30b74d1d1acbe5e8551e4ea30a98ceff955..e4afaf91d677fc2023ececcb34c4dc28a4cfadb9 100644 GIT binary patch delta 2877 zcmZ9OZBSHI7{||9cGm?~?y@4=uya3bW6kJNih+nJfx!YM1R}dk;ee1mbn4=bn9FIfosdndg6h=l4AKa$#ub z)HihMPgR+1T_ps*LP+ZVT@|&S%9_1(j}i+RWDlDg4Uc>Cx~IoA_WO#Yte!ZgmCTXFUggGpy0E^pA_HJUO9H}9f^EGJD+{T+o)+uPsipxeFB z>7iS(&>2W1Ng>|h%Xu_34bH=RyplGv&S58QVf|1KKQZE@PqApIPqX|Hr`n1KjQqelT*e3w&qmr<$B3P_voj<1 zgf`%M;P#flV~m22p5KrOcpG^J9VWqHLWgD4PCHoiXuuIHI6}DNS#*R5ju3P-fa5vV zy2ueKIJ5_BBS+Aoy$m)oe=lZq41?o&X1*TSW2xZKexx>X6dhrLBMcp7*X{HeJGjW9 z2o4K(ynqgi;IN?M95_1J&>}~;;IMMXi|DWl4l6p6#_aSZRy<}`=YKBC1V;pS9A`~q z@$_ZZH|C_Tut}&V*otu{J;}16o?-`~zREhszj{VZupYXDLwMV6{-YysZ<* zb+ntMPdVwE%mei;)-e@NPqXt--)5HSczTAVPdn*5%mcNDbwEAK`k=ncCZWE^R?Ik+ z_wja|{B}NIr8BDXA!gB-JvO7#k67o7lYY$l;mjv^eKlSWn_cPt6tgw{47wip?OFqm zMSCgdU&|PN`=22jBd{?NyOy)P$gag%?X#-#IcB$E);p`Z`!I_YoUxKKjyu0VHcnvU zBvyM(ZRAU2*Ws+JIaT=zvv|zv=T!GO%+?Fe^^z0*M1u2cWD^87L1H&>_8Vk3;4B}^ z{}!{`F<)kC9q_g3tmiRI zT96*oQC*()79>gLWN!Wu4&-OSkmWHteu&EO3;_O9aT{!G<7^eJ!VH$>~wGA#|m@Zh;C2Iz^{)%jdz-CD77S8^L z>=qoBXn+lV$M7x;s~~j$f#Fucx>d4fa_gVSW(sVk#Ab2!FJ!ZD*i~(VzcIWU!zd$c z@DGOBf;C&R=5XsEvN-~qBeB~!dl}hnIIJCpDgR=ai(#*}!4QVq1?zUnn#ZkIkj)d= zJc-@G*{jIzz+qWSV1sKI-h*L1gzjMs^95_ZWG&#<5o8Mlwm@PFIXjAMArA9t8(hb* z2*Xt-*kBC9V!>K0S+)NSZDbtT5`is|*iz0;AX|#VPQWnbKMe21aKJ?OxF<0z6Rc&D zwVYe0kS!P3a*5r^*=b~V&TkM58_Zz1%O7?R1k;nW%S_h?nPcHp5`2?}LoLnO3XN#a hSE$)^G_C3W15pq>P$i1(-vwB`X56-E8qYC delta 2501 zcmZ9Mdr(wW9LLXDc9+L4ULFQBFgxTh(+qQ+F|}Nnw*LDUvZSZEVP4EI)y<)ueGGnSt6$zBRq<2I*vvQi9X7Fh0C?FbCTi6JAHK z2$nu$?PN}tepC3mi@8|(BT3UfH*>SX)bMpW1}}^Xt(jw%%$W@vySJPEzH{8%)L+g$ z1zb|j3V4CpbE%5Y+35@K=d#ZeUc02v^j~guXiw9=NqT4G-emTS7`d9kcZ;+Eod-lQ z&1c1CnoXjW<{oj9X0wY8!m*zm&x?*3j#(CmrW`N8p;;Un9NKUyKP2?w@Hyfvj(FvG5sr9^BOZ>e z(p_;AYR^(|l7Tk7x6@L?*q1nUd>j8DPlhZwEoIp*8Wu|S>U zGh`QFf8L}|`yA{RusUL2fZYn#H0d*X!LlqpS+<^R)$=8?+1Nio&XZsZ!F<*ll3F#J&T&9c+wxz6V=u=~-;+S)zJ=Kz2ze zYnJ}E&ynyWVD7YFx09!6KLO{3a3I6UeVL~K^QW`&L&~?6`Bm9znLXs-ju`q=^24%? zEZP}Z?f^V0;m?3e0Z$P$&H@%#`U-4)%T(Vl$S#8*(?!-_0Sf`EB|HaM1o#9&<2>N< z5Tup7wdJ;|Vpa7Uvc(Xbm)73_?*xo>6Z`{k1z-+A<4?eqma3JusuERo0of7=c1i0+ zz*T^q68;5P3fL#B`T)x;Rb{rSa#i&=vgHuuMUu52a5Z3^gqHx<05%ac{sCNTsak8R zs!&yzk*$DWKw7T=t^@Q%5xfd`7hn-VV*s$yQdMcIs!~;h$W}qnBCSJ!cLVlHI1E?~ zI3}w`0BbB&HMXkts%jM3^$?Us^E&Ms;5}1S(Ny&>;Js5-1dTDk4VJ16wyIiHHI8g; zDBE5d!;kU6jUK-FgqJUj@XG(mTzawXWse0`X?%8IoyNUUdk$PUTy*v{7jvAm+Z#2$ Og*$dR+Q;L#JK}%!tOV`=