[syslog-ng] [PATCH 5/7] [nvtables]: thread safe nv_registry manipulation

Balazs Scheidler bazsi at balabit.hu
Thu Jul 14 13:22:44 CEST 2011


Hi,

The follow-up patch to fix this was pushed to master today:


commit abe191ed272c85f7bceb121aefeb8d8f4c7a9ed4
Author: Balazs Scheidler <bazsi at balabit.hu>
Date:   Thu Jul 14 12:28:12 2011 +0200

    nvtable: fixed locking of the nv_register hash table.
    
    
    Signed-off-by: Balazs Scheidler <bazsi at balabit.hu>



On Sat, 2011-05-28 at 15:56 +0200, Balazs Scheidler wrote:
> Hi,
> 
> This locking is certainly necessary, however the scope is not enough in
> nv_registry_alloc_handle(). The lookup must also be locked, since the
> same name can be associated to a different value otherwise.
> 
> It should also be checked if this would happen on a fastpath though.
> 
> On Mon, 2011-05-23 at 11:56 +0200, Gergely Nagy wrote:
> > From: Juhasz Viktor <jviktor at balabit.hu>
> > 
> > Since nv_registry_alloc_handle() can be indirectly called from
> > multiple threads, when it modifies the registry, that needs to be
> > protected with a mutex.
> > 
> > Same goes for nv_registry_add_alias().
> > 
> > Signed-off-by: Viktor Juhasz <jviktor at balabit.hu>
> > ---
> >  lib/nvtable.c |    6 ++++++
> >  1 files changed, 6 insertions(+), 0 deletions(-)
> > 
> > diff --git a/lib/nvtable.c b/lib/nvtable.c
> > index aa9d8a1..d0a35d3 100644
> > --- a/lib/nvtable.c
> > +++ b/lib/nvtable.c
> > @@ -27,6 +27,8 @@
> >  #include <string.h>
> >  #include <stdlib.h>
> >  
> > +GStaticMutex nv_registry_lock = G_STATIC_MUTEX_INIT;
> > +
> >  const gchar *null_string = "";
> >  
> >  NVHandle
> > @@ -78,8 +80,10 @@ nv_registry_alloc_handle(NVRegistry *self, const gchar *name)
> >    stored.flags = 0;
> >    stored.name_len = len;
> >    stored.name = g_strdup(name);
> > +  g_static_mutex_lock(&nv_registry_lock);
> >    g_array_append_val(self->names, stored);
> >    g_hash_table_insert(self->name_map, stored.name, GUINT_TO_POINTER(self->names->len));
> > +  g_static_mutex_unlock(&nv_registry_lock);
> >    return self->names->len;
> >  }
> >  
> > @@ -91,7 +95,9 @@ nv_registry_alloc_handle(NVRegistry *self, const gchar *name)
> >  void
> >  nv_registry_add_alias(NVRegistry *self, NVHandle handle, const gchar *alias)
> >  {
> > +  g_static_mutex_lock(&nv_registry_lock);
> >    g_hash_table_insert(self->name_map, (gchar *) alias, GUINT_TO_POINTER((glong) handle));
> > +  g_static_mutex_unlock(&nv_registry_lock);
> >  }
> >  
> >  void
> 

-- 
Bazsi




More information about the syslog-ng mailing list