alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.79k stars 495 forks source link

[BUG]CSVWriter 写入CSV数据超过 65536 个字节时报错 [漏网之鱼] #2988

Open CodePlayer opened 1 month ago

CodePlayer commented 1 month ago

之前是在 #2848 的评论中补充,不过该 ISSUE 已经被关闭,也无法重新开启,所以在此再次反馈,以免被忽略。

还有几个方法存在类似的 bug,此处不再赘述,可以直接参考 #2848 的补充评论。

@wenshao 用新版本测试了下,writeBigDecimal 的问题已经解决了,不过又发现了一个类似的 bug。

OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
    writer.writeValue("1".repeat(65534));
    writer.writeComma();
    writer.writeString("123"); // java.lang.StringIndexOutOfBoundsException: offset 65535, count 3, length 65536
}

https://github.com/alibaba/fastjson2/blob/a122b8d58133c429f85a954546d12df2eb233265/core/src/main/java/com/alibaba/fastjson2/support/csv/CSVWriterUTF16.java#L141-L149

定位了下,如上所示,是 CSVWriterUTF16142 行代码处没有 预先检测数组容量 所致。

错误堆栈信息如下:

java.lang.StringIndexOutOfBoundsException: offset 65535, count 3, length 65536

    at java.base/java.lang.String.checkBoundsOffCount(String.java:4593)
    at java.base/java.lang.String.getChars(String.java:1681)
    at com.alibaba.fastjson2.support.csv.CSVWriterUTF16.writeString(CSVWriterUTF16.java:142)
    at test.FastjsonTest.test(FastjsonTest.java:56)

发现这些 bug 有些随机,必须要恰好构造出符合特定条件的数据才能出现。

Originally posted by @CodePlayer in https://github.com/alibaba/fastjson2/issues/2848#issuecomment-2358258198