diff options
author | Dominik Stadler <centic@apache.org> | 2024-07-18 07:09:32 +0000 |
---|---|---|
committer | Dominik Stadler <centic@apache.org> | 2024-07-18 07:09:32 +0000 |
commit | 0dea4a301c971c42ceaf0ed43cc6a3545026507e (patch) | |
tree | 7317833310a67bdf288fac2f901d364dbc600e65 /poi/src/test/java/org | |
parent | 0dac5680c31bc7b2014ce6b76cabf91adc39a908 (diff) | |
download | poi-0dea4a301c971c42ceaf0ed43cc6a3545026507e.tar.gz poi-0dea4a301c971c42ceaf0ed43cc6a3545026507e.zip |
Bug 66425: Avoid exceptions found via poi-fuzz
Processing formats uses regular expressions. Very complex formats
can recurse very deeply and thus can cause StackOVerflows depending
on the used stack-size.
In order to handle this a bit more gracefully, we now catch this
and report a better exception with details about the parsed
format and potential mitigation.
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=66137
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1919342 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poi/src/test/java/org')
-rw-r--r-- | poi/src/test/java/org/apache/poi/hssf/extractor/TestExcelExtractor.java | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/poi/src/test/java/org/apache/poi/hssf/extractor/TestExcelExtractor.java b/poi/src/test/java/org/apache/poi/hssf/extractor/TestExcelExtractor.java index 495ceb9837..8e27789f97 100644 --- a/poi/src/test/java/org/apache/poi/hssf/extractor/TestExcelExtractor.java +++ b/poi/src/test/java/org/apache/poi/hssf/extractor/TestExcelExtractor.java @@ -382,4 +382,16 @@ final class TestExcelExtractor { assertContains(txt, "Macro2"); } } + + @Test + void testStackOverflowInRegex() throws IOException { + try (ExcelExtractor extractor = createExtractor("clusterfuzz-testcase-minimized-POIHSSFFuzzer-4657005060816896.xls")) { + extractor.getText(); + } catch (IllegalStateException e) { + // we either get a StackOverflow or a parsing error depending on the stack-size of the current JVM, + // so we expect both here + assertTrue(e.getMessage().contains("Provided formula is too complex") || + e.getMessage().contains("Did not have a ExtendedFormatRecord")); + } + } } |