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:19:51 UTC

[logging-log4j2] branch release-2.x 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 release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new 9ed470f  LOG4J2-3028: Always clear the OutputStreamManager buffer on flush
9ed470f is described below

commit 9ed470fcef1da227d8a24f7bd81de4dd487775ab
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     | 27 ++++++++++++++++++++++
 src/changes/changes.xml                            |  3 +++
 3 files changed, 36 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 f581ade..c9fb397 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
@@ -278,10 +278,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 86d1990..ffcebfc 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,29 @@ 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());
+    }
 }
\ No newline at end of file
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 6808cf0..0ad7b0f 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,9 @@
     -->
     <release version="2.14.1" date="2021-MM-DD" description="GA Release 2.14.1">
       <!-- FIXES -->
+      <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.