On Thu, Jan 31, 2013 at 09:36:30AM +0100, Olivier Fourdan wrote:
> Hey Peter,
> 
> Peter Hutterer said the following on 01/31/2013 04:55 AM:
> >On Wed, Jan 30, 2013 at 02:03:59PM +0100, Olivier Fourdan wrote:
> >>[...]
> >>So I think this adding this check here is not sufficient. Ideally,
> >>this should be done when loading the database (also because people
> >>could add new definitions without rebuilding and running "make
> >>check").
> >right, and that's where we have to do it anyway since we otherwise won't
> >notice (as one gets overwritten). How about the following patch then?
> >I opted against g_assert() to give the caller a chance to clean up before
> >exiting rather than just killing it.
> 
> Agreed, although we return a NULL db so the caller is most likely to
> dislike that it ;-)
> 
> >diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c
> >index 9813a4e..3eb65df 100644
> >--- a/libwacom/libwacom-database.c
> >+++ b/libwacom/libwacom-database.c
> >@@ -564,6 +564,13 @@ libwacom_database_new_for_path (const char *datadir)
> >         for (match = matches; *match; match++) {
> >                 const char *matchstr;
> >                 matchstr = libwacom_match_get_match_string(*match);
> >+                /* no duplicate matches allowed */
> >+                if (g_hash_table_contains(db->device_ht, matchstr)) {
> 
> g_hash_table_contains() was added in glib 2.32 which is still fairly recent.
> 
> I'd rather use g_hash_table_lookup() which is available in a much wider range 
> of versions of glib.
> 
> Performance wise, it's the same, both g_hash_table_contains() and 
> g_hash_table_lookup() end up calling g_hash_table_lookup_node() internally.
> 
> 
> >+                        g_critical("Duplicate match of '%s' on device 
> >'%s'.",
> >+                                    matchstr, libwacom_get_name(d));
> >+                        libwacom_database_destroy(db);
> >+                        return NULL;
> >+                }
> 
> Aren't you leaking files here?
> 
> What about the attached variant of your patch?

works for me. applied, thanks.

Cheers,
   Peter

> From 4811cd5255eaa095a4c9a37ddca909994b319cc2 Mon Sep 17 00:00:00 2001
> From: Peter Hutterer <peter.hutte...@who-t.net>
> Date: Thu, 31 Jan 2013 09:32:50 +0100
> Subject: [PATCH] libwacom: bail out if a duplicate match string is found
> 
> If two devices use the same match string, something is wrong.
> Log a critical error and return a NULL database.
> 
> Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
> ---
>  libwacom/libwacom-database.c |   19 ++++++++++++++-----
>  1 files changed, 14 insertions(+), 5 deletions(-)
> 
> diff --git a/libwacom/libwacom-database.c b/libwacom/libwacom-database.c
> index 9813a4e..14b5a4a 100644
> --- a/libwacom/libwacom-database.c
> +++ b/libwacom/libwacom-database.c
> @@ -564,6 +564,14 @@ libwacom_database_new_for_path (const char *datadir)
>           for (match = matches; *match; match++) {
>                   const char *matchstr;
>                   matchstr = libwacom_match_get_match_string(*match);
> +                 /* no duplicate matches allowed */
> +                 if (g_hash_table_lookup(db->device_ht, matchstr) != NULL) {
> +                         g_critical("Duplicate match of '%s' on device 
> '%s'.",
> +                                     matchstr, libwacom_get_name(d));
> +                         libwacom_database_destroy(db);
> +                         db = NULL;
> +                         goto end;
> +                 }
>                   g_hash_table_insert (db->device_ht, g_strdup (matchstr), d);
>                   d->refcnt++;
>           }
> @@ -591,17 +599,18 @@ libwacom_database_new_for_path (const char *datadir)
>           g_free(path);
>      }
>  
> -    while(nfiles--)
> -         free(files[nfiles]);
> -    free(files);
> -
>      /* If we couldn't load _anything_ then something's wrong */
>      if (g_hash_table_size (db->device_ht) == 0 &&
>       g_hash_table_size (db->stylus_ht) == 0) {
>           libwacom_database_destroy(db);
> -         return NULL;
> +         db = NULL;
>      }
>  
> +end:
> +    while(nfiles--)
> +         free(files[nfiles]);
> +    free(files);
> +
>      return db;
>  }
>  
> -- 
> 1.7.1
> 


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to