You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2021/03/01 15:22:04 UTC

[logging-log4j2] branch master updated: LOG4J2-3028: Always clear the OutputStreamManager buffer on flush

This is an automated email from the ASF dual-hosted git repository.

ckozak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new 74a8389  LOG4J2-3028: Always clear the OutputStreamManager buffer on flush
74a8389 is described below

commit 74a83898652e9f822936b0f0649fbae3437b49ce
Author: jakubk <ja...@palantir.com>
AuthorDate: Thu Feb 25 15:59:28 2021 +0000

    LOG4J2-3028: Always clear the OutputStreamManager buffer on flush
---
 .../log4j/core/appender/OutputStreamManager.java   |  9 +++++---
 .../core/appender/OutputStreamManagerTest.java     | 26 ++++++++++++++++++++++
 src/changes/changes.xml                            |  3 +++
 3 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
index 6686d99..ffac65a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
@@ -279,10 +279,13 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
      */
     protected synchronized void flushBuffer(final ByteBuffer buf) {
         ((Buffer) buf).flip();
-        if (buf.remaining() > 0) {
-            writeToDestination(buf.array(), buf.arrayOffset() + buf.position(), buf.remaining());
+        try {
+            if (buf.remaining() > 0) {
+                writeToDestination(buf.array(), buf.arrayOffset() + buf.position(), buf.remaining());
+            }
+        } finally {
+            buf.clear();
         }
-        buf.clear();
     }
 
     /**
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
index ef45d92..609a8ff 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.logging.log4j.core.appender;
 
+import java.io.IOException;
+import java.io.OutputStream;
 import java.util.List;
 
 import org.apache.logging.log4j.Level;
@@ -51,4 +53,28 @@ public class OutputStreamManagerTest {
                 data.getThrowable().toString());
     }
 
+    @Test
+    public void testOutputStreamAppenderFlushClearsBufferOnException() {
+        IOException exception = new IOException();
+        final OutputStream throwingOutputStream = new OutputStream() {
+            @Override
+            public void write(int b) throws IOException {
+                throw exception;
+            }
+        };
+
+        final int bufferSize = 3;
+        OutputStreamManager outputStreamManager = new OutputStreamManager(throwingOutputStream, "test", null, false, bufferSize);
+
+        for (int i = 0; i < bufferSize - 1; i++) {
+            outputStreamManager.getByteBuffer().put((byte) 0);
+        }
+
+        assertEquals(outputStreamManager.getByteBuffer().remaining(), 1);
+
+        AppenderLoggingException appenderLoggingException = assertThrows(AppenderLoggingException.class, () -> outputStreamManager.flushBuffer(outputStreamManager.getByteBuffer()));
+        assertEquals(appenderLoggingException.getCause(), exception);
+
+        assertEquals(outputStreamManager.getByteBuffer().limit(), outputStreamManager.getByteBuffer().capacity());
+    }
 }
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e99ffea..0f19b32 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -227,6 +227,9 @@
       </action>
     </release>
     <release version="2.14.1" date="2020-MM-DD" description="GA Release 2.14.1">
+      <action issue="LOG4J2-3028" dev="ckozak" type="fix" due-to="Jakub Kozlowski">
+        OutputStreamManager.flushBuffer always resets the buffer, previously the buffer was not reset after an exception.
+      </action>
       <action issue="LOG4J2-2981" dev="rgoers" type="fix">
         OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy
         unless minSize was set to 0.