Author: mahadev
Date: Mon Jul 25 17:45:00 2011
New Revision: 1150802

URL: http://svn.apache.org/viewvc?rev=1150802&view=rev
Log:
ZOOKEEPER-1027. chroot not transparent in zoo_create() (Thijs Terlouw via  
mahadev)

Modified:
    zookeeper/trunk/CHANGES.txt
    zookeeper/trunk/src/c/src/zookeeper.c
    zookeeper/trunk/src/c/tests/TestClient.cc

Modified: zookeeper/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1150802&r1=1150801&r2=1150802&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Mon Jul 25 17:45:00 2011
@@ -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 

Modified: zookeeper/trunk/src/c/src/zookeeper.c
URL: 
http://svn.apache.org/viewvc/zookeeper/trunk/src/c/src/zookeeper.c?rev=1150802&r1=1150801&r2=1150802&view=diff
==============================================================================
--- zookeeper/trunk/src/c/src/zookeeper.c (original)
+++ zookeeper/trunk/src/c/src/zookeeper.c Mon Jul 25 17:45:00 2011
@@ -877,10 +877,11 @@ char* sub_string(zhandle_t *zh, const ch
     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(co
 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
                         *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);

Modified: zookeeper/trunk/src/c/tests/TestClient.cc
URL: 
http://svn.apache.org/viewvc/zookeeper/trunk/src/c/tests/TestClient.cc?rev=1150802&r1=1150801&r2=1150802&view=diff
==============================================================================
--- zookeeper/trunk/src/c/tests/TestClient.cc (original)
+++ zookeeper/trunk/src/c/tests/TestClient.cc Mon Jul 25 17:45:00 2011
@@ -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()


Reply via email to