Bug 64244 - [PATCH] Fix exception from using applyFont for unicode representation _xHHHH_
Summary: [PATCH] Fix exception from using applyFont for unicode representation _xHHHH_
Status: RESOLVED FIXED
Alias: None
Product: POI
Classification: Unclassified
Component: XSSF (show other bugs)
Version: 4.1.2-FINAL
Hardware: PC All
: P2 major (vote)
Target Milestone: ---
Assignee: POI Developers List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-03-19 13:39 UTC by Hyeonmin Park
Modified: 2020-03-24 11:29 UTC (History)
1 user (show)



Attachments
Add testUtfDecode_withApplyFont and patch XSSFRichTextString.getFormatMap (1.53 KB, patch)
2020-03-19 13:39 UTC, Hyeonmin Park
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Hyeonmin Park 2020-03-19 13:39:50 UTC
Created attachment 37107 [details]
Add testUtfDecode_withApplyFont and patch XSSFRichTextString.getFormatMap

If you use `applyFont()` for `XSSFRichString` having unicode representation _xHHHH_ format, an IllegalArgumentException is thrown. `testUtfDecode_withApplyFont` is a new test made by myself, also in the patch.

> Text length was 8 but the last format index was 20
> java.lang.IllegalArgumentException: Text length was 8 but the last format index was 20
> 	at org.apache.poi.xssf.usermodel.XSSFRichTextString.buildCTRst(XSSFRichTextString.java:590)
> 	at org.apache.poi.xssf.usermodel.XSSFRichTextString.applyFont(XSSFRichTextString.java:157)
> 	at org.apache.poi.xssf.usermodel.XSSFRichTextString.applyFont(XSSFRichTextString.java:167)
> 	at org.apache.poi.xssf.usermodel.TestXSSFRichTextString.testUtfDecode_withApplyFont(TestXSSFRichTextString.java:269)
> 	...

So I modified `XSSFRichTextString.getFormatMap()` to sum length after utf-decoded. Then the test and all tests are passed well.

Actually, I have an original xlsx file that makes this problem, but due to the security reason, I can't share the file. I think someone can help making MWE.
Comment 1 Dominik Stadler 2020-03-24 11:00:59 UTC
Fixed via r1875571, I ended up adding a more optimized utfLength() method which avoids constructing the full replaced string when only the resulting length is required.
Comment 2 Hyeonmin Park 2020-03-24 11:29:56 UTC
Thanks a lot, and looking forward to release soon. :)