You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ph...@apache.org on 2018/04/26 22:22:18 UTC

zookeeper git commit: ZOOKEEPER-3007: Potential NPE in ReferenceCountedACLCache#deserialize

Repository: zookeeper
Updated Branches:
  refs/heads/master 79627c6e0 -> 2c0168ad3


ZOOKEEPER-3007: Potential NPE in ReferenceCountedACLCache#deserialize

LJ1043041006 found a potential NPE in ZK

Author: gongleigl.gong <go...@qunar.com>
Author: brettkk <10...@qq.com>

Reviewers: phunt@apache.org

Closes #495 from brettKK/master and squashes the following commits:

7eb9e1c9b [gongleigl.gong] fix RTE message in ReferenceCountedACLCache class
0b858826d [gongleigl.gong] del logger error and fix error message
a12b13ff7 [brettkk] fix format
f7da9b9fa [brettkk] change ZOOK3007 to compare with apache master
cf9fb5f9a [brettkk] recover code
c4db5e25d [brettkk] recover zookeeper master same with apache:master
700dfb7f4 [gongleigl.gong] fix NPE bug
7d8d5230c [gongleigl.gong] d

Change-Id: I012c242e8566fcd54c1ebde1a30ec785b6aa31b0


Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/2c0168ad
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/2c0168ad
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/2c0168ad

Branch: refs/heads/master
Commit: 2c0168ad37b529447ac8cb1bf866d014f8a97981
Parents: 79627c6
Author: gongleigl.gong <go...@qunar.com>
Authored: Thu Apr 26 15:21:06 2018 -0700
Committer: Patrick Hunt <ph...@apache.org>
Committed: Thu Apr 26 15:21:36 2018 -0700

----------------------------------------------------------------------
 .../server/ReferenceCountedACLCache.java        |  3 ++
 .../server/ReferenceCountedACLCacheTest.java    | 29 +++++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2c0168ad/src/java/main/org/apache/zookeeper/server/ReferenceCountedACLCache.java
----------------------------------------------------------------------
diff --git a/src/java/main/org/apache/zookeeper/server/ReferenceCountedACLCache.java b/src/java/main/org/apache/zookeeper/server/ReferenceCountedACLCache.java
index 486b845..384d23a 100644
--- a/src/java/main/org/apache/zookeeper/server/ReferenceCountedACLCache.java
+++ b/src/java/main/org/apache/zookeeper/server/ReferenceCountedACLCache.java
@@ -109,6 +109,9 @@ public class ReferenceCountedACLCache {
             }
             List<ACL> aclList = new ArrayList<ACL>();
             Index j = ia.startVector("acls");
+            if (j == null) {
+                throw new RuntimeException("Incorrent format of InputArchive when deserialize DataTree - missing acls");
+            }
             while (!j.done()) {
                 ACL acl = new ACL();
                 acl.deserialize(ia, "acl");

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/2c0168ad/src/java/test/org/apache/zookeeper/server/ReferenceCountedACLCacheTest.java
----------------------------------------------------------------------
diff --git a/src/java/test/org/apache/zookeeper/server/ReferenceCountedACLCacheTest.java b/src/java/test/org/apache/zookeeper/server/ReferenceCountedACLCacheTest.java
index 076657b..795472f 100644
--- a/src/java/test/org/apache/zookeeper/server/ReferenceCountedACLCacheTest.java
+++ b/src/java/test/org/apache/zookeeper/server/ReferenceCountedACLCacheTest.java
@@ -20,6 +20,8 @@ package org.apache.zookeeper.server;
 
 import org.apache.jute.BinaryInputArchive;
 import org.apache.jute.BinaryOutputArchive;
+import org.apache.jute.InputArchive;
+import org.apache.jute.OutputArchive;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Id;
@@ -188,10 +190,35 @@ public class ReferenceCountedACLCacheTest {
         callAddUsageNTimes(deserializedCache, aclId3, 3);
         callAddUsageNTimes(deserializedCache, aclId4, 4);
         callAddUsageNTimes(deserializedCache, aclId5, 5);
-
         assertCachesEqual(cache, deserializedCache);
     }
 
+    @Test
+    public void testNPEInDeserialize() throws IOException {
+        ReferenceCountedACLCache serializeCache = new ReferenceCountedACLCache(){
+            @Override
+            public synchronized void serialize(OutputArchive oa) throws IOException {
+                oa.writeInt(1, "map");
+                oa.writeLong(1, "long");
+                oa.startVector(null, "acls");
+                oa.endVector(null, "acls");
+            }
+        };
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        BinaryOutputArchive archive = BinaryOutputArchive.getArchive(baos);
+        serializeCache.serialize(archive);
+        BinaryInputArchive inArchive = BinaryInputArchive.getArchive(new ByteArrayInputStream(baos.toByteArray()));
+        ReferenceCountedACLCache deserializedCache = new ReferenceCountedACLCache();
+        try {
+            deserializedCache.deserialize(inArchive);
+        } catch (NullPointerException e){
+            fail("should not throw NPE while do deserialized");
+        } catch (RuntimeException e) {
+            // do nothing.
+        }
+    }
+
+
     private void assertCachesEqual(ReferenceCountedACLCache expected, ReferenceCountedACLCache actual){
         assertEquals(expected.aclIndex, actual.aclIndex);
         assertEquals(expected.aclKeyMap, actual.aclKeyMap);