From 775da74dee125b4b6dbaace3b32da14b01a04b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Mon, 24 Nov 2025 20:44:02 +0100 Subject: [PATCH] Fix NPE in XWPFParagraph.getCTSpacing(). (#950) We recently changed the getters so they don't create the PPr object if it doesn't exist, but we missed adding one null check for the new situation. Add a test to exercise all the getters in a case where there isn't a PPr object. --- .../poi/xwpf/usermodel/XWPFParagraph.java | 3 ++ .../poi/xwpf/usermodel/TestXWPFParagraph.java | 44 ++++++++++++++++++ test-data/document/emptyPPr.docx | Bin 0 -> 13349 bytes 3 files changed, 47 insertions(+) create mode 100644 test-data/document/emptyPPr.docx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index d572da627e..89a681ecf8 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -1457,6 +1457,9 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para */ private CTSpacing getCTSpacing(boolean create) { CTPPr pr = getCTPPr(create); + if (pr == null) { + return null; + } CTSpacing ct = pr.getSpacing(); if (create && ct == null) { ct = pr.addNewSpacing(); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java index 2aaf6b1072..5ef646a77c 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java @@ -921,6 +921,50 @@ public final class TestXWPFParagraph { } } + @Test + void testGettersWithEmptyParagraphProperties() throws IOException { + try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("emptyPPr.docx")) { + XWPFParagraph p = doc.getParagraphArray(0); + + assertNull(p.getNumID()); + assertNull(p.getNumIlvl()); + assertNull(p.getNumFmt()); + assertNull(p.getNumLevelText()); + assertNull(p.getNumStartOverride()); + assertFalse(p.isKeepNext()); + + assertFalse(p.isAlignmentSet()); + assertEquals(ParagraphAlignment.LEFT, p.getAlignment()); + assertEquals(TextAlignment.AUTO, p.getVerticalAlignment()); + + assertEquals(Borders.NONE, p.getBorderTop()); + assertEquals(Borders.NONE, p.getBorderBottom()); + assertEquals(Borders.NONE, p.getBorderLeft()); + assertEquals(Borders.NONE, p.getBorderRight()); + assertEquals(Borders.NONE, p.getBorderBetween()); + + assertEquals(-1, p.getSpacingAfter()); + assertEquals(-1, p.getSpacingAfterLines()); + assertEquals(-1, p.getSpacingBefore()); + assertEquals(-1, p.getSpacingBeforeLines()); + assertEquals(-1, p.getSpacingBetween()); + assertEquals(LineSpacingRule.AUTO, p.getSpacingLineRule()); + + assertEquals(-1, p.getIndentationLeft()); + assertEquals(-1, p.getIndentationLeftChars()); + assertEquals(-1, p.getIndentationRight()); + assertEquals(-1, p.getIndentationRightChars()); + assertEquals(-1, p.getIndentationHanging()); + assertEquals(-1, p.getIndentationFirstLine()); + + assertFalse(p.isPageBreak()); + assertFalse(p.isWordWrapped()); + + assertNull(p.getStyleID()); + assertNull(p.getStyle()); + } + } + private static void checkSearchText(XWPFParagraph paragraph, String search, int beginRun, int endRun, int beginText, int endText, int beginChar, int endChar) { TextSegment result = paragraph.searchText(search, new PositionInParagraph()); diff --git a/test-data/document/emptyPPr.docx b/test-data/document/emptyPPr.docx new file mode 100644 index 0000000000000000000000000000000000000000..7ef696b1e13b43e4ea4986a3457cde945ed6b2e0 GIT binary patch literal 13349 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 NoxtcS&-~lg{{w*4