Jelajahi Sumber

ZOOKEEPER-1906. zkpython: invalid data in GetData for empty node (Nikita Vetoshkin via michim)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1583783 13f79535-47bb-0310-9956-ffa450edef68
Michi Mutsuzaki 11 tahun lalu
induk
melakukan
bc2b5f7460

+ 3 - 0
CHANGES.txt

@@ -593,6 +593,9 @@ BUGFIXES:
   ZOOKEEPER-1725. Zookeeper Dynamic Conf writes out hostnames when IPs are
   supplied (Alexander Shraer via michim)
 
+  ZOOKEEPER-1906. zkpython: invalid data in GetData for empty node
+  (Nikita Vetoshkin via michim)
+
 IMPROVEMENTS:
 
   ZOOKEEPER-1170. Fix compiler (eclipse) warnings: unused imports,

+ 1 - 1
src/contrib/zkpython/src/c/zookeeper.c

@@ -1223,7 +1223,7 @@ static PyObject *pyzoo_get(PyObject *self, PyObject *args)
   }
 
   PyObject *stat_dict = build_stat( &stat );
-  PyObject *ret = Py_BuildValue( "(s#,N)", buffer,buffer_len, stat_dict );
+  PyObject *ret = Py_BuildValue( "(s#,N)", buffer,buffer_len < 0 ? 0 : buffer_len, stat_dict );
   free(buffer);
 
   return ret;

+ 13 - 0
src/contrib/zkpython/src/test/get_set_test.py

@@ -32,6 +32,19 @@ class GetSetTest(zktestbase.TestBase):
         except:
             pass
 
+    def test_empty_node(self):
+        """
+        Test for a bug when instead of empty string we can get
+        random data from buffer malloc'ed to hold node contents.
+        See ZOOKEEPER-1906 for details
+        """
+        NODE_PATH = "/zk-python-test-empty-node"
+        self.ensureDeleted(NODE_PATH)
+        zookeeper.create(self.handle, NODE_PATH, "",
+                         [{"perms":0x1f, "scheme":"world", "id" :"anyone"}])
+        (data,stat) = zookeeper.get(self.handle, NODE_PATH, None)
+        self.assertEqual(data, "", "Data is not empty as expected: " + data)
+
     def test_sync_getset(self):
         self.assertEqual(self.connected, True, "Not connected!")
         (data,stat) = zookeeper.get(self.handle, "/zk-python-getsettest", None)