Просмотр исходного кода

ZOOKEEPER-182. zookeeper_init accepts empty host-port string and returns valid pointer to zhandle_t

git-svn-id: https://svn.apache.org/repos/asf/hadoop/zookeeper/trunk@704657 13f79535-47bb-0310-9956-ffa450edef68
Patrick D. Hunt 16 лет назад
Родитель
Сommit
217fddb4b4
2 измененных файлов с 35 добавлено и 0 удалено
  1. 4 0
      src/c/src/zookeeper.c
  2. 31 0
      src/c/tests/TestZookeeperInit.cc

+ 4 - 0
src/c/src/zookeeper.c

@@ -415,6 +415,10 @@ zhandle_t *zookeeper_init(const char *host, watcher_fn watcher,
     } else {
        zh->watcher = null_watcher_fn;
     }
+    if (host == 0 || *host == 0) { // what we shouldn't dup
+        errno=EINVAL;
+        goto abort;
+    }
     zh->hostname = strdup(host);
     if (zh->hostname == 0) {
         goto abort;

+ 31 - 0
src/c/tests/TestZookeeperInit.cc

@@ -39,6 +39,10 @@ class Zookeeper_init : public CPPUNIT_NS::TestFixture
 	CPPUNIT_TEST(testBasic);
     CPPUNIT_TEST(testAddressResolution);
     CPPUNIT_TEST(testMultipleAddressResolution);
+    CPPUNIT_TEST(testNullAddressString);
+    CPPUNIT_TEST(testEmptyAddressString);
+    CPPUNIT_TEST(testOneSpaceAddressString);
+    CPPUNIT_TEST(testTwoSpacesAddressString);
     CPPUNIT_TEST(testInvalidAddressString1);
     CPPUNIT_TEST(testInvalidAddressString2);
     CPPUNIT_TEST(testNonexistentHost);
@@ -161,6 +165,33 @@ public:
                 CPPUNIT_ASSERT_EQUAL(3434,(int)ntohs(addr->sin_port));
         }
     }
+    void testNullAddressString()
+    {
+        zh=zookeeper_init(NULL,0,0,0,0,0);
+        CPPUNIT_ASSERT(zh==0);
+        CPPUNIT_ASSERT_EQUAL(EINVAL,errno);
+    }
+    void testEmptyAddressString()
+    {
+        const string INVALID_HOST("");
+        zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0);
+        CPPUNIT_ASSERT(zh==0);
+        CPPUNIT_ASSERT_EQUAL(EINVAL,errno);
+    }
+    void testOneSpaceAddressString()
+    {
+        const string INVALID_HOST(" ");
+        zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0);
+        CPPUNIT_ASSERT(zh==0);
+        CPPUNIT_ASSERT_EQUAL(EINVAL,errno);
+    }
+    void testTwoSpacesAddressString()
+    {
+        const string INVALID_HOST("  ");
+        zh=zookeeper_init(INVALID_HOST.c_str(),0,0,0,0,0);
+        CPPUNIT_ASSERT(zh==0);
+        CPPUNIT_ASSERT_EQUAL(EINVAL,errno);
+    }
     void testInvalidAddressString1()
     {
         const string INVALID_HOST("host1");