]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rados: fixed Python3 string conversion issue on get_fsid 28476/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 19 Feb 2019 16:02:41 +0000 (11:02 -0500)
committerNathan Cutler <ncutler@suse.com>
Mon, 10 Jun 2019 16:02:05 +0000 (18:02 +0200)
Fixes: http://tracker.ceph.com/issues/38381
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 005f19eff0b4a92647e5847e306718be76704432)

src/pybind/rados/rados.pyx
src/test/pybind/test_rados.py

index 052c491517df838e010923d9094ee6859b21c615..40064441e4e8bb8ab5244cfedecdb1d42ee24d4d 100644 (file)
@@ -1160,26 +1160,23 @@ Rados object in state %s." % self.state)
         """
         self.require_state("connected")
         cdef:
-            char *ret_buf
-            size_t buf_len = 37
-            PyObject* ret_s = NULL
+            char *ret_buf = NULL
+            size_t buf_len = 64
 
-        ret_s = PyBytes_FromStringAndSize(NULL, buf_len)
         try:
-            ret_buf = PyBytes_AsString(ret_s)
-            with nogil:
-                ret = rados_cluster_fsid(self.cluster, ret_buf, buf_len)
-            if ret < 0:
-                raise make_ex(ret, "error getting cluster fsid")
-            if ret != <int>buf_len:
-                _PyBytes_Resize(&ret_s, ret)
-            return <object>ret_s
+            while True:
+                ret_buf = <char *>realloc_chk(ret_buf, buf_len)
+                with nogil:
+                    ret = rados_cluster_fsid(self.cluster, ret_buf, buf_len)
+                if ret == -errno.ERANGE:
+                    buf_len = buf_len * 2
+                elif ret < 0:
+                    raise make_ex(ret, "error getting cluster fsid")
+                else:
+                    break
+            return decode_cstr(ret_buf)
         finally:
-            # We DECREF unconditionally: the cast to object above will have
-            # INCREFed if necessary. This also takes care of exceptions,
-            # including if _PyString_Resize fails (that will free the string
-            # itself and set ret_s to NULL, hence XDECREF).
-            ref.Py_XDECREF(ret_s)
+            free(ret_buf)
 
     @requires(('ioctx_name', str_type))
     def open_ioctx(self, ioctx_name):
index 4057a4eea808806936ae5c3790ea7214de2ab344..c4ed1d248b3d2705151dded3990923bd0af09f23 100644 (file)
@@ -10,6 +10,7 @@ import threading
 import json
 import errno
 import os
+import re
 import sys
 
 # Are we running Python 2.x
@@ -240,7 +241,7 @@ class TestRados(object):
 
     def test_get_fsid(self):
         fsid = self.rados.get_fsid()
-        eq(len(fsid), 36)
+        assert re.match('[0-9a-f\-]{36}', fsid, re.I)
 
     def test_blacklist_add(self):
         self.rados.blacklist_add("1.2.3.4/123", 1)