Author: henry
Date: Fri Apr 30 22:50:13 2010
New Revision: 939866

URL: http://svn.apache.org/viewvc?rev=939866&view=rev
Log:
ZOOKEEPER-758. zkpython segfaults on invalid acl with missing key

Modified:
    hadoop/zookeeper/trunk/CHANGES.txt
    hadoop/zookeeper/trunk/src/contrib/zkpython/src/c/zookeeper.c
    hadoop/zookeeper/trunk/src/contrib/zkpython/src/test/acl_test.py

Modified: hadoop/zookeeper/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/CHANGES.txt?rev=939866&r1=939865&r2=939866&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/CHANGES.txt (original)
+++ hadoop/zookeeper/trunk/CHANGES.txt Fri Apr 30 22:50:13 2010
@@ -41,6 +41,9 @@ BUGFIXES: 
   ZOOKEEPER-750. move maven artifacts into "dist-maven" subdir of the
   release (package target) (phunt via henryr)
 
+  ZOOKEEPER-758. zkpython segfaults on invalid acl with missing key
+  (Kapil Thangavelu via henryr)
+
 IMPROVEMENTS:
   ZOOKEEPER-724. Improve junit test integration - log harness information 
   (phunt via mahadev)

Modified: hadoop/zookeeper/trunk/src/contrib/zkpython/src/c/zookeeper.c
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zkpython/src/c/zookeeper.c?rev=939866&r1=939865&r2=939866&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zkpython/src/c/zookeeper.c (original)
+++ hadoop/zookeeper/trunk/src/contrib/zkpython/src/c/zookeeper.c Fri Apr 30 
22:50:13 2010
@@ -286,8 +286,9 @@ PyObject *build_string_vector(const stru
 
 /* Returns 1 if the PyObject is a valid representation of an ACL, and
    0 otherwise. */
-int check_is_acl(PyObject *o) { 
+int check_is_acl(PyObject *o) {
   int i;
+  PyObject *entry;
   if (o == NULL) {
     return 0;
   }
@@ -295,10 +296,26 @@ int check_is_acl(PyObject *o) { 
     return 0;
   }
   for (i=0;i<PyList_Size(o);++i) {
-    if (!PyDict_Check(PyList_GetItem(o,i))) {
+    PyObject *element = PyList_GetItem(o,i);
+    if (!PyDict_Check(element)) {
+      return 0;
+    }
+    entry = PyDict_GetItemString( element, "perms" );
+    if (entry == Py_None) {
+      return 0;
+    }
+
+    entry = PyDict_GetItemString( element, "scheme" );
+    if (entry == Py_None) {
+      return 0;
+    }
+
+    entry = PyDict_GetItemString( element, "id" );
+    if (entry == Py_None) {
       return 0;
     }
   }
+
   return 1;
 }
 

Modified: hadoop/zookeeper/trunk/src/contrib/zkpython/src/test/acl_test.py
URL: 
http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/contrib/zkpython/src/test/acl_test.py?rev=939866&r1=939865&r2=939866&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/contrib/zkpython/src/test/acl_test.py (original)
+++ hadoop/zookeeper/trunk/src/contrib/zkpython/src/test/acl_test.py Fri Apr 30 
22:50:13 2010
@@ -85,5 +85,25 @@ class ACLTest(zktestbase.TestBase):
       acls = zookeeper.get_acl(self.handle, "/zk-python-aacltest")
       self.assertEqual(acls[1], [ZOO_ACL_READ], "Wrong ACL returned from get 
when aset")
 
+    def test_invalid_acl(self):
+      self.assertRaises(zookeeper.InvalidACLException,
+                        zookeeper.create,
+                        self.handle,
+                        "/zk-python-aclverifytest",
+                        "",
+                        None,
+                        zookeeper.EPHEMERAL)
+      
+    def test_invalid_acl2(self):
+      """Verify all required keys are present in the ACL."""
+      invalid_acl = [{"schema": "digest", "id": "zebra"}],
+      self.assertRaises(zookeeper.InvalidACLException,
+                        zookeeper.create,
+                        self.handle,
+                        "/zk-python-aclverifytest",
+                        "",
+                        invalid_acl,
+                        zookeeper.EPHEMERAL))
+
 if __name__ == '__main__':
     unittest.main()


Reply via email to