Eric Blake
2019-Jun-27 16:10 UTC
[Libguestfs] [libnbd PATCH] python: Fix bindings for Path parameters
Our use of PyUnicode_FSConverter was wrong - the result is a PyObject*
rather than a char* (where dereferencing then calling free() on that
pointer as char* has catastrophic effects).
With this patch, I was able to set up a qemu-nbd encrypted server over
a Unix socket (using a pending patch on the qemu list), coupled with
a python connection to that socket:
$ ~/qemu/qemu-nbd -r -k /tmp/nbdsock --object \
tls-creds-psk,id=tls0,endpoint=server,dir=/home/eblake/libnbd/tests \
--tls-creds tls0 -f raw -x / tmpfile
$ ./run nbdsh
nbd> h.set_tls_psk_file('tests/keys.psk')
nbd> h.set_tls(2)
nbd> h.set_export_name('/')
nbd> h.connect_unix('/tmp/nbdsock')
instead of getting a segfault.
---
generator/generator | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/generator/generator b/generator/generator
index c29460c..fa12232 100755
--- a/generator/generator
+++ b/generator/generator
@@ -3608,7 +3608,9 @@ let print_python_binding name { args; ret } | Mutable
arg ->
pr " PyObject *%s;\n" (List.hd (name_of_arg arg))
| Opaque _ -> ()
- | Path n -> pr " char *%s = NULL;\n" n
+ | Path n ->
+ pr " PyObject *py_%s = NULL;\n" n;
+ pr " char *%s = NULL;\n" n
| SockAddrAndLen (n, _) ->
pr " /* XXX Complicated - Python uses a tuple of
different\n";
pr " * lengths for the different socket types.\n";
@@ -3699,7 +3701,7 @@ let print_python_binding name { args; ret } | Int64 n
-> pr ", &%s" n
| Mutable arg -> pr ", &%s" (List.hd (name_of_arg arg))
| Opaque n -> pr ", &%s_data->data" (find_callback n)
- | Path n -> pr ", PyUnicode_FSConverter, &%s" n
+ | Path n -> pr ", PyUnicode_FSConverter, &py_%s" n
| SockAddrAndLen (n, _) -> pr ", &%s" n
| String n -> pr ", &%s" n
| StringList n -> pr ", &py_%s" n
@@ -3750,7 +3752,9 @@ let print_python_binding name { args; ret } | Mutable
_ ->
pr " abort (); /* Mutable for normal Python parameters not impl
*/\n"
| Opaque n -> ()
- | Path _ -> ()
+ | Path n ->
+ pr " %s = PyBytes_AS_STRING (py_%s);\n" n n;
+ pr " assert (%s != NULL);\n" n
| SockAddrAndLen _ ->
pr " abort (); /* XXX SockAddrAndLen not implemented */\n";
| String _ -> ()
@@ -3860,7 +3864,8 @@ let print_python_binding name { args; ret } | Int64 _
-> ()
| Mutable _ -> ()
| Opaque _ -> ()
- | Path n -> pr " free (%s);\n" n
+ | Path n ->
+ pr " Py_XDECREF (py_%s);\n" n
| SockAddrAndLen _ -> ()
| String n -> ()
| StringList n -> pr " nbd_internal_py_free_string_list
(%s);\n" n
--
2.20.1
Richard W.M. Jones
2019-Jun-27 19:47 UTC
Re: [Libguestfs] [libnbd PATCH] python: Fix bindings for Path parameters
ACK again -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://people.redhat.com/~rjones/virt-df/
Possibly Parallel Threads
- [PATCH libnbd] generator: Add Mutable type to the generator.
- [PATCH libnbd] generator: Add SizeT type, maps to C size_t.
- [PATCH libnbd 1/2] generator: Handle closure args (cbargs) specially.
- [libnbd PATCH 2/2] RFC: generator: Handle shared callbacks in Python
- [PATCH libnbd 3/4] api: Add nbd_connect_socket.