On Tuesday 05 August 2014 22:35:23 Hilko Bengen wrote: > The following code, reported by Peter Wu <pe...@lekensteyn.nl>, broke > on x86_64 with different symptoms on Python2 and Python3 (malloc() > failure and segmentation fault, respectively): > > r = h.node_set_value(h.root(), { > 'key': 'broken', > 't': 4, > 'value': 1234 > }) > --- > generator/generator.ml | 25 ++++++++++++++++++++----- > 1 file changed, 20 insertions(+), 5 deletions(-) > > diff --git a/generator/generator.ml b/generator/generator.ml > index bcf1966..0fa5c04 100755 > --- a/generator/generator.ml > +++ b/generator/generator.ml > @@ -2799,6 +2799,7 @@ typedef int Py_ssize_t; > #include <stdio.h> > #include <stdlib.h> > #include <assert.h> > +#include <inttypes.h> > > #include \"hivex.h\" > > @@ -2868,14 +2869,28 @@ get_value (PyObject *v, hive_set_value *ret) > PyErr_SetString (PyExc_RuntimeError, \"no 'value' element in > dictionary\"); return -1; > } > + if (PyInt_Check (obj)) {
Triggers -Wimplicit-function-declaration for me (Python 3.4.1). > + uint32_t* v = malloc (sizeof (uint32_t)); > + *v = PyInt_AsLong (obj); This also triggers implicit function warning. > + ret->value = (char*) v; > + ret->len = sizeof (uint32_t); > #ifdef HAVE_PYSTRING_ASSTRING > - ret->value = PyString_AsString (obj); > - ret->len = PyString_Size (obj); > + } else if (PyString_Check (obj)) { > + ret->value = PyString_AsString (obj); > + ret->len = PyString_Size (obj); > #else > - bytes = PyUnicode_AsUTF8String (obj); > - ret->value = PyBytes_AS_STRING (bytes); > - ret->len = PyBytes_GET_SIZE (bytes); > + } else if (PyUnicode_Check (obj)) { > + bytes = PyUnicode_AsUTF8String (obj); > + if (!bytes) { > + return -1; > + } > + ret->value = PyBytes_AS_STRING (bytes); > + ret->len = PyBytes_GET_SIZE (bytes); > #endif > + } else { > + PyErr_SetString (PyExc_RuntimeError, \"Cannot use 'value' element in > dictionary\"); + return -1; > + } > > return 0; > } Reproduced with this one-liner: PYTHONPATH=python/.libs python -c \ "import hivex;h=hivex.Hivex('images/minimal',write=True); h.node_set_value(h.root(), {'key':'x', 't':5, 'value':123})" I'll give a shot at fixing this, the key handling is equally broken: python -c 'import hivex; h=hivex.Hivex("images/minimal");h.node_set_values(h.root(), [{"key":1}])' Kind regards, Peter https://lekensteyn.nl _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs