Преглед изворни кода

ZOOKEEPER-1027. chroot not transparent in zoo_create() (Thijs Terlouw via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1150802 13f79535-47bb-0310-9956-ffa450edef68
Mahadev Konar пре 14 година
родитељ
комит
82eeb94d13
3 измењених фајлова са 22 додато и 7 уклоњено
  1. 3 0
      CHANGES.txt
  2. 11 7
      src/c/src/zookeeper.c
  3. 8 0
      src/c/tests/TestClient.cc

+ 3 - 0
CHANGES.txt

@@ -253,6 +253,9 @@ BUGFIXES:
 
   ZOOKEEPER-1111. JMXEnv uses System.err instead of logging
   (Ivan Kelly via phunt)
+  
+  ZOOKEEPER-1027. chroot not transparent in zoo_create() (Thijs Terlouw via
+  mahadev)
 
 IMPROVEMENTS:
   ZOOKEEPER-724. Improve junit test integration - log harness information 

+ 11 - 7
src/c/src/zookeeper.c

@@ -877,10 +877,11 @@ char* sub_string(zhandle_t *zh, const char* server_path) {
     char *ret_str;
     if (zh->chroot == NULL)
         return (char *) server_path;
-    if (strncmp(server_path, zh->chroot, strlen(zh->chroot) != 0)) {
+    //ZOOKEEPER-1027
+    if (strncmp(server_path, zh->chroot, strlen(zh->chroot)) != 0) {
         LOG_ERROR(("server path %s does not include chroot path %s",
                    server_path, zh->chroot));
-        return NULL;
+        return (char *) server_path;
     }
     if (strlen(server_path) == strlen(zh->chroot)) {
         //return "/"
@@ -1827,7 +1828,8 @@ completion_list_t *dequeue_completion(completion_head_t *list)
 static void process_sync_completion(
         completion_list_t *cptr,
         struct sync_completion *sc,
-        struct iarchive *ia)
+        struct iarchive *ia,
+	zhandle_t *zh)
 {
     LOG_DEBUG(("Processing sync_completion with type=%d xid=%#x rc=%d",
             cptr->c.type, cptr->xid, sc->rc));
@@ -1887,14 +1889,16 @@ static void process_sync_completion(
             struct CreateResponse res;
             int len;
             deserialize_CreateResponse(ia, "reply", &res);
-            len = strlen(res.path) + 1;
-            if (len > sc->u.str.str_len) {
+            //ZOOKEEPER-1027
+            const char * client_path = sub_string(zh, res.path); 
+            len = strlen(client_path) + 1;if (len > sc->u.str.str_len) {
                 len = sc->u.str.str_len;
             }
             if (len > 0) {
-                memcpy(sc->u.str.str, res.path, len - 1);
+                memcpy(sc->u.str.str, client_path, len - 1);
                 sc->u.str.str[len - 1] = '\0';
             }
+            free_duplicate_path(client_path, res.path);
             deallocate_CreateResponse(&res);
         }
         break;
@@ -2236,7 +2240,7 @@ int zookeeper_process(zhandle_t *zh, int events)
                         *sc = (struct sync_completion*)cptr->data;
                 sc->rc = rc;
                 
-                process_sync_completion(cptr, sc, ia); 
+                process_sync_completion(cptr, sc, ia, zh); 
                 
                 notify_sync_completion(sc);
                 free_buffer(bptr);

+ 8 - 0
src/c/tests/TestClient.cc

@@ -850,6 +850,14 @@ public:
                          create_completion_fn, 0);
         waitForCreateCompletion(3);
         CPPUNIT_ASSERT(count == 0);
+
+        //ZOOKEEPER-1027 correctly return path_buffer without prefixed chroot
+        const char* path = "/zookeeper1027";
+        char path_buffer[1024];
+        int path_buffer_len=sizeof(path_buffer);
+        rc = zoo_create(zk_ch, path, "", 0, &ZOO_OPEN_ACL_UNSAFE, 0, path_buffer, path_buffer_len);
+        CPPUNIT_ASSERT_EQUAL((int) ZOK, rc);
+        CPPUNIT_ASSERT_EQUAL(string(path), string(path_buffer));
     }
 
     void testAsyncWatcherAutoReset()