You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/09/13 15:10:28 UTC

logging-log4j2 git commit: LOG4J2-1447 bugfix in remove: off-by-one error and should null out the removed slot.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master a9069ad03 -> 6d90ac76f


LOG4J2-1447	bugfix in remove: off-by-one error and should null out the removed slot.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6d90ac76
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6d90ac76
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6d90ac76

Branch: refs/heads/master
Commit: 6d90ac76fbd26910a5a9c6a5d1a7b1450704c759
Parents: a9069ad
Author: rpopma <rp...@apache.org>
Authored: Wed Sep 14 00:10:32 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Wed Sep 14 00:10:32 2016 +0900

----------------------------------------------------------------------
 .../logging/log4j/util/ArrayContextData.java    |  6 ++--
 .../log4j/util/ArrayContextDataTest.java        | 32 ++++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6d90ac76/log4j-api/src/main/java/org/apache/logging/log4j/util/ArrayContextData.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ArrayContextData.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/ArrayContextData.java
index 9864a99..6dc5672 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ArrayContextData.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/ArrayContextData.java
@@ -282,8 +282,10 @@ public class ArrayContextData implements MutableContextData {
             assertNotFrozen();
             assertNoConcurrentModification();
 
-            System.arraycopy(keys, index + 1, keys, index, size - index);
-            System.arraycopy(values, index + 1, values, index, size - index);
+            System.arraycopy(keys, index + 1, keys, index, size - 1 - index);
+            System.arraycopy(values, index + 1, values, index, size - 1 - index);
+            keys[size - 1] = null;
+            values[size - 1] = null;
             size--;
         }
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6d90ac76/log4j-api/src/test/java/org/apache/logging/log4j/util/ArrayContextDataTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/ArrayContextDataTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/ArrayContextDataTest.java
index db9cfc2..adbabb8 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/ArrayContextDataTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/ArrayContextDataTest.java
@@ -488,6 +488,38 @@ public class ArrayContextDataTest {
     }
 
     @Test
+    public void testRemoveNullsOutRemovedSlot() throws Exception {
+        final ArrayContextData original = new ArrayContextData();
+        original.putValue("a", "avalue");
+        original.putValue("b", "bvalue");
+        original.putValue("c", "cvalue");
+        original.putValue("d", "dvalue");
+        original.remove("a");
+        original.remove("b");
+        original.remove("c");
+        original.remove("d");
+        assertNull(original.getValueAt(0));
+
+        // ensure slots in the values array are nulled out
+        Field f = ArrayContextData.class.getDeclaredField("values");
+        f.setAccessible(true);
+        Object[] values = (Object[]) f.get(original);
+        for (int i = 0; i < values.length; i++) {
+            assertNull(values[i]);
+        }
+    }
+
+    @Test
+    public void testRemoveWhenFull() throws Exception {
+        final ArrayContextData original = new ArrayContextData();
+        original.putValue("a", "avalue");
+        original.putValue("b", "bvalue");
+        original.putValue("c", "cvalue");
+        original.putValue("d", "dvalue"); // default capacity = 4
+        original.remove("d");
+    }
+
+    @Test
     public void testNullValuesArePreserved() {
         final ArrayContextData original = new ArrayContextData();
         original.putValue("a", "avalue");