This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-csv.git
commit fca97cd9ced9ca22c6081588d0a696f52b2beaa2 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Mon Mar 11 10:23:29 2024 -0400 [CSV-311] OutOfMemory for very long rows despite using column value of type Reader --- src/changes/changes.xml | 1 + src/main/java/org/apache/commons/csv/CSVFormat.java | 19 ++----------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 42b7a569..0b854b7d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -50,6 +50,7 @@ <action type="fix" dev="ggregory" due-to="step-security-bot">[StepSecurity] CI: Harden GitHub Actions #329, #330.</action> <action type="fix" issue="CSV-147" dev="ggregory" due-to="Steven Peterson, Benedikt Ritter, Gary Gregory, Joerg Schaible, Buddhi De Silva, Elliotte Rusty Harold">Better error message during faulty CSV record read #347.</action> <action type="fix" issue="CSV-310" dev="ggregory" due-to="Buddhi De Silva">Misleading error message when QuoteMode set to None #352.</action> + <action type="fix" issue="CSV-311" dev="ggregory" due-to="Christian Feuersaenger, Gary Gregory">OutOfMemory for very long rows despite using column value of type Reader.</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump commons-io:commons-io: from 2.11.0 to 2.15.1.</action> <action type="update" dev="ggregory" due-to="Gary Gregory, Dependabot">Bump commons-parent from 57 to 67.</action> diff --git a/src/main/java/org/apache/commons/csv/CSVFormat.java b/src/main/java/org/apache/commons/csv/CSVFormat.java index c0c36ded..40b2d007 100644 --- a/src/main/java/org/apache/commons/csv/CSVFormat.java +++ b/src/main/java/org/apache/commons/csv/CSVFormat.java @@ -2325,28 +2325,13 @@ public final class CSVFormat implements Serializable { final char quote = getQuoteCharacter().charValue(); // (1) Append opening quote append(quote, appendable); - // (2) Append Reader content - final StringBuilder builder = new StringBuilder(IOUtils.DEFAULT_BUFFER_SIZE); + // (2) Append Reader contents, doubling quotes int c; - int pos = 0; while (EOF != (c = reader.read())) { - builder.append((char) c); + append((char) c, appendable); if (c == quote) { - // Append current segment - if (pos > 0) { - append(builder.toString(), appendable); - // Recycle builder - builder.setLength(0); - pos = -1; - } - // Append nested quote append(quote, appendable); } - pos++; - } - // Append last segment - if (pos > 0) { - append(builder.substring(0, pos), appendable); } // (3) Append closing quote append(quote, appendable);