From 00541acbbffcd6c3d4267078f1644e554e1200f8 Mon Sep 17 00:00:00 2001 From: Patrick White Date: Tue, 30 May 2017 13:22:41 -0700 Subject: [PATCH 1/2] ZOOKEEPER-2797 Defend against bad TTLs from misbehaving clients --- .../server/PrepRequestProcessor.java | 12 ++++++--- .../zookeeper/server/CreateTTLTest.java | 25 ++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java b/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java index 9ad4eea83cf..a4fc7d3b4c9 100644 --- a/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java +++ b/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java @@ -658,10 +658,10 @@ private void pRequest2TxnCreate(int type, Request request, Record record, boolea path = createRequest.getPath(); acl = createRequest.getAcl(); data = createRequest.getData(); - ttl = 0; + ttl = -1; } CreateMode createMode = CreateMode.fromFlag(flags); - validateCreateRequest(createMode, request); + validateCreateRequest(path, createMode, request, ttl); String parentPath = validatePathForCreate(path, request.sessionId); List listACL = fixupACL(path, request.authInfo, acl); @@ -925,8 +925,14 @@ private List removeDuplicates(List acl) { return retval; } - private void validateCreateRequest(CreateMode createMode, Request request) + private void validateCreateRequest(String path, CreateMode createMode, Request request, long ttl) throws KeeperException { + try { + EphemeralType.validateTTL(createMode, ttl); + } catch (IllegalArgumentException e) { + BadArgumentsException bae = new BadArgumentsException(path); + throw bae; + } if (createMode.isEphemeral()) { // Exception is set when local session failed to upgrade // so we just need to report the error diff --git a/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java b/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java index 66d17eba5ee..d084b43c915 100644 --- a/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java +++ b/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java @@ -23,9 +23,15 @@ import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.Op; import org.apache.zookeeper.OpResult; +import org.apache.zookeeper.TestableZooKeeper; import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.KeeperException.Code; import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.proto.CreateResponse; +import org.apache.zookeeper.proto.CreateTTLRequest; +import org.apache.zookeeper.proto.ReplyHeader; +import org.apache.zookeeper.proto.RequestHeader; import org.apache.zookeeper.test.ClientBase; import org.junit.Assert; import org.junit.Test; @@ -37,7 +43,7 @@ import java.util.concurrent.atomic.AtomicLong; public class CreateTTLTest extends ClientBase { - private ZooKeeper zk; + private TestableZooKeeper zk; @Override public void setUp() throws Exception { @@ -68,6 +74,23 @@ public void testCreate() Assert.assertNull("Ttl node should have been deleted", zk.exists("/foo", false)); } + @Test + public void testBadTTLs() + throws IOException, KeeperException, InterruptedException { + Stat stat = new Stat(); + RequestHeader h = new RequestHeader(1, ZooDefs.OpCode.createTTL); + + String path = "/bad_ttl"; + CreateTTLRequest request = new CreateTTLRequest(path, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT_WITH_TTL.toFlag(), -100); + CreateResponse response = new CreateResponse(); + ReplyHeader r = zk.submitRequest(h, request, response, null); + Assert.assertEquals("An invalid CreateTTLRequest should throw BadArguments", + r.getErr(), Code.BADARGUMENTS.intValue()); + Assert.assertNull("An invalid CreateTTLRequest should not result in znode creation", + zk.exists(path, false)); + } + @Test public void testCreateSequential() throws IOException, KeeperException, InterruptedException { From 25b79a2bf33c399ffbb4969c137d346d75700f56 Mon Sep 17 00:00:00 2001 From: Patrick White Date: Tue, 30 May 2017 21:52:11 -0700 Subject: [PATCH 2/2] Remove extraneous Stat and exception --- src/java/test/org/apache/zookeeper/server/CreateTTLTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java b/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java index d084b43c915..70fa223578a 100644 --- a/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java +++ b/src/java/test/org/apache/zookeeper/server/CreateTTLTest.java @@ -75,9 +75,7 @@ public void testCreate() } @Test - public void testBadTTLs() - throws IOException, KeeperException, InterruptedException { - Stat stat = new Stat(); + public void testBadTTLs() throws InterruptedException, KeeperException { RequestHeader h = new RequestHeader(1, ZooDefs.OpCode.createTTL); String path = "/bad_ttl";