From 7b8e2fcd2a9c669a3e716d920eaec140771a75be Mon Sep 17 00:00:00 2001 From: Markus Jung Date: Wed, 3 Dec 2025 13:07:57 +0100 Subject: [PATCH] Fix #418: Prevent NPE in OdfTable#getRowByIndex --- .../odftoolkit/odfdom/doc/table/OdfTable.java | 6 +++--- .../org/odftoolkit/odfdom/doc/TableTest.java | 7 +++++++ .../test-input/HeaderRowBetweenTableRows.ods | Bin 0 -> 5746 bytes 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 odfdom/src/test/resources/test-input/HeaderRowBetweenTableRows.ods diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java b/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java index 5782c9947..0271676c2 100644 --- a/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java +++ b/odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTable.java @@ -1709,8 +1709,8 @@ public OdfTableColumn getColumnByIndex(int index) { return null; } - private OdfTableRow getHeaderRowByIndex(TableTableHeaderRowsElement headers, int nIndex) { - int result = 0; + private OdfTableRow getHeaderRowByIndex(TableTableHeaderRowsElement headers, int nIndex, int beginIndex) { + int result = beginIndex; OdfTableRow row = null; for (Node n : new DomNodeList(headers.getChildNodes())) { if (n instanceof TableTableRowElement) { @@ -1760,7 +1760,7 @@ public OdfTableRow getRowByIndex(int index) { OdfTableRow row = null; for (Node n : new DomNodeList(mTableElement.getChildNodes())) { if (n instanceof TableTableHeaderRowsElement) { - row = getHeaderRowByIndex((TableTableHeaderRowsElement) n, index); + row = getHeaderRowByIndex((TableTableHeaderRowsElement) n, index, result); if (row != null) { return row; } diff --git a/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java b/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java index b42d595ac..766e03701 100644 --- a/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java +++ b/odfdom/src/test/java/org/odftoolkit/odfdom/doc/TableTest.java @@ -149,4 +149,11 @@ public void create2ndTableTab() throws Exception { mysheet.save(ResourceUtilities.getTestOutputFile(TEST_FILE_SAVE_2TABLES_OUT)); } + + @Test + public void testTableWithHeaderRowBetweenTableRows() throws Exception { + OdfDocument odfdoc = OdfDocument.loadDocument(ResourceUtilities.getAbsoluteInputPath("HeaderRowBetweenTableRows.ods")); + OdfTable table = odfdoc.getTableByName("Table1"); + table.getRowByIndex(1); + } } diff --git a/odfdom/src/test/resources/test-input/HeaderRowBetweenTableRows.ods b/odfdom/src/test/resources/test-input/HeaderRowBetweenTableRows.ods new file mode 100644 index 0000000000000000000000000000000000000000..1a88032f074bd378c4ce55188aa7d8ee415a3c83 GIT binary patch literal 5746 zcmZ`-1yCH@wjCsBa2q^01a}C*U4y#~?l!m#3>GW|2!Y@boZzkr5+DQ;Ah>042!ju< zpWOFf-P~LCPS@$`>e_2}ozuJ4UT0~lqM%{{02ly(lx>7bl#6H_7XSeGJs(~HTpe9) zy#qXKK^`71j@BS=M|U@FUpE^rcM#YS%;oN3>t^F_?c-|e=FJ86@UjKjfE{dYy)_?l z52DthK7o;vQ-mv0>tdZq1yS$_JU=Jndtr_$d-XaWokS7x zXcs0~n=_2bb~2ApoDvwNOz9iUY>uq5=#ahH!tN*Nt=T|;fHW^RtiSFCAMNgPNamSw z39^w}2kGb^?da*J{xDD=kmeZ4HY(RFTVJb7F~MkipP8a-oiIz>E+Xcg;44oG(M ziXTjNAd9mx%CaQ>=%j9>c%Eh#CQ8$W!Gn4|X^{5DYI9gwEmE61dkYp3jCn!&svnX> zTgQ~`GuH238nyHNa0X-HyYaXxtinF4mo{KbviGx$jt!GhfyXWLH^-uYx;bX#!dhFV zqV;fPY|Wi)nYjqv$MSW)_}5sneO% zna2%gb008w##~SZvx%+R!MoDSo|1$Ik|X1>on8?#>BJ{Wp^xFDlzFnUx_m%!DEtxv zi7{74vOsuDm6ocH<{XruTkfan+(33i{e1D63#-M#IRwYjG;pI23+RH;+(ZNtfMt9z z|Bv>pD$9fy3@T=*vD&n<>4kf9j|mFFmjM(gJ>k@cV!FH7S8*#g(QlBvA}h4g>roq3 z3mJ4d^oE%-wry)`g2uiIu4|ukGl)}|GdK)gfw05BFrV>eUM;}Dp8;s(A0AL~ zK@P1UgP2UjuJjOttrgT>YK2>jktR9}yI5)oR9ifWzxh`4XcZkPVjL}W1G0=S3~6Zf zj2}WoxJyHSU=JVDF;dI?pkut9ru)UO@dRHtqME$*hn@{yDEF}LB@MNxQn_X6Pqxyv z#XM_;F4F?dO5K54W44^!nO&Y_x>aTGq=a;KBzNy%m-P(oGdV-}D9;%8 zhQ0t+%nFURO>uI*OI}qj@Pr&nIu0<^p8g=GeQV--zjJJRG5L{P;+OBB2V0^}hT)@bUK?2B`k-0e40R-DK2j5MHC8_MB$JKR2SS}2^0-osDx3H8h2RgdV6` z9UmB5{lO{n9y{|2;mm$DwtDalFP4UDVNZGtOVTveM`uqSPf3UWw0WKDT3EH@NGy1= zaY~w~EKqTOQ+@dEA}SP%*9YzG;J~%;>(ess)44C9C4I7DjTTeQ2@xL;zSD?U;jmhs zd1`{6M3f|`Qk(`y`=|2QKse`Dg<}Z1c^S``>*ew%f$(J9oVAw5HGGaS_+S!rS&Iu=pAf<##@P00I5 zS8oRd)xA3tUi4soWJ9OBQUntP!=x5Gop;FUs^~SZ&AbvUHibp76IUe<>uH7&eMWIq z4n|IX5WSCu5$Pfb`=hm^d%Jwg8Jxl7y~9gt3!HOfvI011@rc4Kk#MY8rk1R3 zwdC;<8vE#*pKbUHLk!AOd8$vd8-zkwu2S-JH+Lh6;yb(d7VR1-70z;LBV55c8H`2~ zl@%2VQ*EvW%K=+lzBnE5=X}Pu-d4*OdlvK;6Td!p^~qmv?Kk%n23=L~&o)0Z-!yr8 zKg!4&vMr>zd(|Q6lA(<;uIt#{6#AlyyyFysX{J<>P~Ldz`zhE}!=x^bi9JxPM#1kw zbU3hq;QFiXoW@xqqH}MjuH};8Dh^e^Hx%<>f%hVW_gOc)he3Q2S~VB+9`Fsc&Y8=2 z8W~kJvyOQw{((=Qa0Nf$oNT-cU0j;hZ`dG4wXeOjBEKH7pO$0W&?V$tfBr+Rdaqq9 z01QX`ZOnUA6SYxE37a) zbx4Zh6_s0iK%=a$tw@Vys%5-7E}TtEfa!n~_yPpII$|LdGb2!5DY-Q7S&;We;2tKc z;Ai(rDSdflb!Y+|Z)VzoRwkk|zHOA4R|F6g3tc#M89~~ksfUwtc=Q^00{TyA2-KvR z*8RG>P*WI3ikQfG+=N<4d6NW~ewgC%xOygWEIH$oG|TQ8LED5%VzxIK<)%RJRKqpt z)ImbyDVi(~v`;gBNEiw`U*I*Bt4)YL^d#Uc z-dZ&onJd z1@+!!^Js9|XAnoZ&rI$iCxg{y^Un+)Z`2%gbB~n^=vt0@up||F!Pcuz)zD|TiQ)%Y z8-}K?TA8yDu_L;Hs!a63$x(B^I%T%1vrBhMcVacJ_x440T_r|Q7u%hTqj=mUg~LO| zWC?>4%L}~P>3m?Z!L;iiO+j~f|DhS=2Q}6CpwI}DnQd7gXl8^20C->;fVI1u_iy?2 zz%)yS>aSNt@Vm}yq%!)H*vZj>R}4*J=Zsgds??6}G--cS0= znqF>5$(lk=ci?j;h#6UCmLRvvF(;Cd5)jYI)9F~v1-(PWpyWF5Mf=B~X~(BlG)&L9 z_^PR5o4gMFkUQSK+L_YR1d=$~MZF>(Zhd7+^(*^>oxx;NVrR|77A`cvL%8jv;+&s} zud?QAnrPVB{y>s7vo*wn#iPM>P2Hy;g`)Iq08do-y|L8~_xL~z5qB{=Dj|ILgovr9 zBqjpYEec31lpL%@ajx$+L}vX-cC&{WR1m#i*w%BHc{frFV$!~s@KXphKXZOHT%VnW z?Jj}WNB#)A_k1eNGujE%7mltalEXyO`g zIkCK*Q{>E9r^02R1+rhv5058UiAN6HFdWZLPLwP_m6}ect~lDglV4T#LPFa%SP z1R2sk{nbE5?5Y9Zu=BzdOCQ3{Je9lMX_aN0JQxN}Il?@Th2 zjT(eq(;WB@;Imp$MPb-d>qt569c8lHiR-4F<&}8A7}+AF2x(M1+}NJad|Rx35eNgN zB-#v zu8S_jYuy$tQjIiY=Z)QpRmStko_57+)Tt!}FBBE)?Bz35k3jRdqV}(mE4KoX=?>ID zE@jvzq|KD$erGDeS7}XFG=Al1g)Ml|G=7EpGJ1THsM_|Oa$S^;h_xNI^$n5$IzJ73 z&UH@1r;#`NmYEVa(6k?$6aO(ONFoO&`FT!JQ@DK>Av6;ZA)e`N+p%WV5kbV64Kd;h zJKm@h&7;TDGSu+iU-qkIG!wDMx`X1R_4KDvrZjM}_)y$!vauJzw+8CwT$j*WWG{;4 z_{K{0p5S<9m0%Kqz(a{;O2+*_(kKN!p=YAL9+?c7`^g-2V&9j@PcvgeC6k>{aV176 z-v1Q6bLx*rMZr{wXCM_8P$5e8HfPaYn5I8_ zK{fWaotj;1DmYFs(Vf{(1j(w18~~4V?HcCFAL$bsX;06iz1alumxk! z6XoZJ;97}-#k2xZ*Zfps*g(NmBNTV|X6siWr!|;5@yVyGUm1Mwve}ZtQ3rM1W`sC! z=D@jhC!^BQ*g$nnvSTI2#j>bnx&ASETqXRy`71T}(#0nv0=GwX&ha09t+-a?7583x zFVPOaWBhVWN%G^`7=M=OFpS9^&C=a`uAbXr)Jwop%?B{wS7)f_-ElFg&nzO(R5e{N zpP*8reDP!;^-AzY4XZUwfGnOFyq=#(`f=V6Ov7*fEL zjz(Mmx3)feg#Rw;WRr+uKh6Q=@d=eQ-(nsWMk%vNaDC_}4CgiUHf?6VZP zgYq)nO1<&IT)`kW;ov*+@ohWnJ z`i|pjCOab1wP0Ur`NKab=Hy=ON#ZWfjc7%q#N`^5Qw;}5oTKxEWSy|1&eE>)91BU1 zK<9I0>t7D%l)jQxC6CzlS$)fpEN!yLTYU1t$L6IsJaUz|m#9q+6fvy{ZLC2i{{{(= zYynG9376Mz=<~CXTbI`cx6ZUV6gt0{jqg2O=Dd5kyr+4iKH5%Sz5q9)`sEH@qb7=l z^d;Jj_sM1ll@tg1C0`y}2wr4<*Rr}dM8Dd~|8(?X*y$aNeBV~(pqe{Vg?qh`OrwA1 zc=q%&uHvIS2jLfHRM(`GA1jV-xFt68jkKAc#X=gy`hFboE z=s9EX!%0M*k|9AJJOJ1pJK=C&RHH5K@L_MWIcMg|xG@*AiFI&`OdTW0t#fm3^c}zF zcwKz1HN5M|1cTZFxUie}C~%_y{uyX@##}Y}5D@qf{h$>8 z4s->%IojER{}PN;9Wy(9vh{zKmX`*Z(p-2Vjv00^8v+xWk6zvKR_p}%qY oM1K^@zhVEbsJ~%Df5QH(FHO})XureIAFgC10AToGmjQtP1A^*eqW}N^ literal 0 HcmV?d00001