So far RBufferOut return values are 'str' on all the versions of Python.
Python 3 distinguishes between 'str' (unicode strings), and 'bytes',
with 'str' no more able to hold arbitrary data.
For this reason, switch the return value of RBufferOut functions to
bytes on Python 3: while this is a potentially incompatibile change,
this is the only way to handle safely sequences of arbitrary bytes, like
all the ones returned by RBufferOut functions.
---
generator/python.ml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/generator/python.ml b/generator/python.ml
index a70faec8c..c10adcb69 100644
--- a/generator/python.ml
+++ b/generator/python.ml
@@ -511,7 +511,11 @@ and generate_python_actions actions () =
pr " guestfs_int_free_string_list (r);\n";
pr " if (py_r == NULL) goto out;\n";
| RBufferOut _ ->
+ pr "#if PY_MAJOR_VERSION >= 3\n";
+ pr " py_r = PyBytes_FromStringAndSize (r, size);\n";
+ pr "#else\n";
pr " py_r = guestfs_int_py_fromstringsize (r, size);\n";
+ pr "#endif\n";
pr " free (r);\n";
pr " if (py_r == NULL) goto out;\n";
);
--
2.20.1