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);

Reply via email to