From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34481) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIbBT-0002dd-6p for qemu-devel@nongnu.org; Wed, 26 Feb 2014 04:53:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WIbBM-0007IU-UZ for qemu-devel@nongnu.org; Wed, 26 Feb 2014 04:53:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:13997) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIbBM-0007IA-Lp for qemu-devel@nongnu.org; Wed, 26 Feb 2014 04:53:40 -0500 Date: Wed, 26 Feb 2014 10:53:34 +0100 From: Igor Mammedov Message-ID: <20140226105334.24f7d55f@nial.usersys.redhat.com> In-Reply-To: <1392994018-7786-5-git-send-email-stefanha@redhat.com> References: <1392994018-7786-1-git-send-email-stefanha@redhat.com> <1392994018-7786-5-git-send-email-stefanha@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v4 4/6] qdev: add get_pointer_and_free() for temporary strings List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: Kevin Wolf , Paolo Bonzini , Fam Zheng , qemu-devel@nongnu.org, Michael Roth On Fri, 21 Feb 2014 15:46:56 +0100 Stefan Hajnoczi wrote: > get_pointer() assumes the string has unspecified lifetime (at least as > long as the object is alive). In some cases we can only produce a > temporary string that should be freed when get_pointer() is done. >=20 > Signed-off-by: Stefan Hajnoczi > --- > hw/core/qdev-properties-system.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) >=20 > diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-s= ystem.c > index 5f5957e..3bffc01 100644 > --- a/hw/core/qdev-properties-system.c > +++ b/hw/core/qdev-properties-system.c > @@ -31,6 +31,20 @@ static void get_pointer(Object *obj, Visitor *v, Prope= rty *prop, > visit_type_str(v, &p, name, errp); > } > =20 > +/* Same as get_pointer() but frees heap-allocated print() return value */ > +static void get_pointer_and_free(Object *obj, Visitor *v, Property *prop, > + char *(*print)(void *ptr), > + const char *name, Error **errp) > +{ > + DeviceState *dev =3D DEVICE(obj); > + void **ptr =3D qdev_get_prop_ptr(dev, prop); > + char *p; > + > + p =3D *ptr ? print(*ptr) : g_strdup(""); > + visit_type_str(v, &p, name, errp); > + g_free(p); > +} it could be better if get_pointer() would free pointer if 3 current users are converted to return temporary string, something like this: =46rom 65dbdb27e6ccc555e84ddf898d015827fec04d9c Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Wed, 26 Feb 2014 10:37:36 +0100 Subject: [PATCH] qdev: make get_pointer() handle temporary strings get_pointer()'s print() callback might return a heap allocated string, to avoid adding dedicated get_pointer_foo for this case convert current print() callbacks to return temporary heap allocated string and make get_pointer() free it. Signed-off-by: Igor Mammedov --- hw/core/qdev-properties-system.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 5f5957e..d865ea3 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -27,8 +27,9 @@ static void get_pointer(Object *obj, Visitor *v, Property= *prop, void **ptr =3D qdev_get_prop_ptr(dev, prop); char *p; =20 - p =3D (char *) (*ptr ? print(*ptr) : ""); + p =3D (char *) (*ptr ? print(*ptr) : g_strdup("")); visit_type_str(v, &p, name, errp); + g_free(p); } =20 static void set_pointer(Object *obj, Visitor *v, Property *prop, @@ -93,7 +94,7 @@ static void release_drive(Object *obj, const char *name, = void *opaque) =20 static const char *print_drive(void *ptr) { - return bdrv_get_device_name(ptr); + return g_strdup(bdrv_get_device_name(ptr)); } =20 static void get_drive(Object *obj, Visitor *v, void *opaque, @@ -148,8 +149,9 @@ static void release_chr(Object *obj, const char *name, = void *opaque) static const char *print_chr(void *ptr) { CharDriverState *chr =3D ptr; + char *val =3D chr->label ? chr->label : ""; =20 - return chr->label ? chr->label : ""; + return g_strdup(val); } =20 static void get_chr(Object *obj, Visitor *v, void *opaque, @@ -227,8 +229,9 @@ err: static const char *print_netdev(void *ptr) { NetClientState *netdev =3D ptr; + char *val =3D netdev->name ? netdev->name : ""; =20 - return netdev->name ? netdev->name : ""; + return g_strdup(val); } =20 static void get_netdev(Object *obj, Visitor *v, void *opaque, --=20 1.7.1 > static void set_pointer(Object *obj, Visitor *v, Property *prop, > int (*parse)(DeviceState *dev, const char *str, > void **ptr),