
On Mon, Dec 09, 2013 at 10:33:25AM -0600, Doug Goldstein wrote:
On Mon, Dec 9, 2013 at 9:15 AM, Daniel P. Berrange <berrange@redhat.com> wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Replace calls to PyString_AsString with the helper method libvirt_charPtrUnwrap. This isolates the code that will change in Python3.
In making this change, all callers now have responsibility for free'ing the string.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- libvirt-override.c | 106 +++++++++++++++++++++++++++++++---------------------- typewrappers.c | 18 +++++++++ typewrappers.h | 1 + 3 files changed, 81 insertions(+), 44 deletions(-)
@@ -194,12 +193,14 @@ setPyVirTypedParameter(PyObject *info, PyErr_Format(PyExc_LookupError, "Attribute name \"%s\" could not be recognized", keystr); + free(keystr);
Here you use free() but....
goto cleanup; }
strncpy(temp->field, keystr, sizeof(*temp->field) - 1); temp->field[sizeof(*temp->field) - 1] = '\0'; temp->type = params[i].type; + free(keystr);
switch (params[i].type) { case VIR_TYPED_PARAM_INT:
@@ -396,15 +399,20 @@ virPyDictToTypedParams(PyObject *dict, } case VIR_TYPED_PARAM_STRING: { - char *val = PyString_AsString(value); - if (!val || - virTypedParamsAddString(¶ms, &n, &max, keystr, val) < 0) + char *val;; + if (libvirt_charPtrUnwrap(value, &val) < 0 || + !val || + virTypedParamsAddString(¶ms, &n, &max, keystr, val) < 0) { + VIR_FREE(val);
Here you use VIR_FREE(). We should probably be consistent.
Yes, will fix to use VIR_FREE everywhere.
@@ -5105,18 +5117,18 @@ libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self, /******************************************* * Event Impl *******************************************/ -static PyObject *addHandleObj = NULL; -static char *addHandleName = NULL; -static PyObject *updateHandleObj = NULL; -static char *updateHandleName = NULL; -static PyObject *removeHandleObj = NULL; -static char *removeHandleName = NULL; -static PyObject *addTimeoutObj = NULL; -static char *addTimeoutName = NULL; -static PyObject *updateTimeoutObj = NULL; -static char *updateTimeoutName = NULL; -static PyObject *removeTimeoutObj = NULL; -static char *removeTimeoutName = NULL; +static PyObject *addHandleObj; +static char *addHandleName; +static PyObject *updateHandleObj; +static char *updateHandleName; +static PyObject *removeHandleObj; +static char *removeHandleName; +static PyObject *addTimeoutObj; +static char *addTimeoutName; +static PyObject *updateTimeoutObj; +static char *updateTimeoutName; +static PyObject *removeTimeoutObj; +static char *removeTimeoutName;
Not sure the advantage of this change.
Static variables are always NULL initially. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|