On Wed, May 12, 2010 at 10:53:18 -0700, Dan Nicholson wrote: > Yeah, clearly libudev has it's own copies of the strings that it will > keep until we unref the udev_device. So, here's a patch that makes the > InputAttributes members const. Like Keith, I couldn't figure out how to > handle char **tags without an explicit cast. > The attached seems to build without warnings on master.
Cheers, Julien
>From 4a2cce5d324a30847b9591ba7cc9a9c450ec8ae6 Mon Sep 17 00:00:00 2001 From: Julien Cristau <[email protected]> Date: Wed, 12 May 2010 21:18:54 +0200 Subject: [PATCH 1/2] Make InputAttributes strings const --- config/hal.c | 20 ++++++++++---------- config/udev.c | 10 ++++++---- include/input.h | 8 ++++---- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/config/hal.c b/config/hal.c index 6a22323..9caf139 100644 --- a/config/hal.c +++ b/config/hal.c @@ -129,6 +129,8 @@ static void device_added(LibHalContext *hal_ctx, const char *udi) { char *path = NULL, *driver = NULL, *name = NULL, *config_info = NULL; + char **tags = NULL; + char *vendor = NULL; InputOption *options = NULL, *tmpo = NULL; InputAttributes attrs = {0}; DeviceIntPtr dev = NULL; @@ -155,16 +157,16 @@ device_added(LibHalContext *hal_ctx, const char *udi) LogMessage(X_WARNING,"config/hal: no driver or path specified for %s\n", udi); goto unwind; } - attrs.device = xstrdup(path); + attrs.device = path; name = get_prop_string(hal_ctx, udi, "info.product"); if (!name) name = xstrdup("(unnamed)"); else - attrs.product = xstrdup(name); + attrs.product = name; - attrs.vendor = get_prop_string(hal_ctx, udi, "info.vendor"); - attrs.tags = xstrtokenize(get_prop_string(hal_ctx, udi, "input.tags"), ","); + attrs.vendor = vendor = get_prop_string(hal_ctx, udi, "info.vendor"); + attrs.tags = tags = xstrtokenize(get_prop_string(hal_ctx, udi, "input.tags"), ","); if (libhal_device_query_capability(hal_ctx, udi, "input.keys", NULL)) attrs.flags |= ATTR_KEYBOARD; @@ -389,16 +391,14 @@ unwind: free(tmpo); } - free(attrs.product); - free(attrs.vendor); - free(attrs.device); - if (attrs.tags) { - char **tag = attrs.tags; + free(vendor); + if (tags) { + char **tag = tags; while (*tag) { free(*tag); tag++; } - free(attrs.tags); + free(tags); } if (xkb_opts.layout) diff --git a/config/udev.c b/config/udev.c index 5e8d8da..941bfbe 100644 --- a/config/udev.c +++ b/config/udev.c @@ -46,6 +46,7 @@ device_added(struct udev_device *udev_device) char *config_info = NULL; const char *syspath; const char *key, *value, *tmp; + char **tags = NULL; InputOption *options = NULL, *tmpo; InputAttributes attrs = {}; DeviceIntPtr dev = NULL; @@ -87,7 +88,8 @@ device_added(struct udev_device *udev_device) add_option(&options, "path", path); add_option(&options, "device", path); attrs.device = path; - attrs.tags = xstrtokenize(udev_device_get_property_value(udev_device, "ID_INPUT.tags"), ","); + tags = xstrtokenize(udev_device_get_property_value(udev_device, "ID_INPUT.tags"), ","); + attrs.tags = tags; config_info = Xprintf("udev:%s", syspath); if (!config_info) @@ -154,13 +156,13 @@ device_added(struct udev_device *udev_device) free(tmpo); } - if (attrs.tags) { - char **tag = attrs.tags; + if (tags) { + char **tag = tags; while (*tag) { free(*tag); tag++; } - free(attrs.tags); + free(tags); } return; diff --git a/include/input.h b/include/input.h index 63f981e..aadcdf1 100644 --- a/include/input.h +++ b/include/input.h @@ -212,10 +212,10 @@ typedef struct _InputOption { } InputOption; typedef struct _InputAttributes { - char *product; - char *vendor; - char *device; - char **tags; /* null-terminated */ + const char *product; + const char *vendor; + const char *device; + char * const *tags; /* null-terminated */ uint32_t flags; } InputAttributes; -- 1.7.1
>From d074587905b1d86431efaf85977f5e04850b6f57 Mon Sep 17 00:00:00 2001 From: Julien Cristau <[email protected]> Date: Wed, 12 May 2010 21:29:55 +0200 Subject: [PATCH 2/2] config/hal: don't leak the input.tags property --- config/hal.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config/hal.c b/config/hal.c index 9caf139..9396cef 100644 --- a/config/hal.c +++ b/config/hal.c @@ -130,7 +130,7 @@ device_added(LibHalContext *hal_ctx, const char *udi) { char *path = NULL, *driver = NULL, *name = NULL, *config_info = NULL; char **tags = NULL; - char *vendor = NULL; + char *vendor = NULL, *hal_tags; InputOption *options = NULL, *tmpo = NULL; InputAttributes attrs = {0}; DeviceIntPtr dev = NULL; @@ -166,7 +166,9 @@ device_added(LibHalContext *hal_ctx, const char *udi) attrs.product = name; attrs.vendor = vendor = get_prop_string(hal_ctx, udi, "info.vendor"); - attrs.tags = tags = xstrtokenize(get_prop_string(hal_ctx, udi, "input.tags"), ","); + hal_tags = get_prop_string(hal_ctx, udi, "input.tags"); + attrs.tags = tags = xstrtokenize(hal_tags, ","); + free(hal_tags); if (libhal_device_query_capability(hal_ctx, udi, "input.keys", NULL)) attrs.flags |= ATTR_KEYBOARD; -- 1.7.1
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
