aboutsummaryrefslogtreecommitdiff
path: root/src/lockmanager
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-12-21 14:03:13 +0000
committerChristian Grothoff <christian@grothoff.org>2012-12-21 14:03:13 +0000
commitedf376bcc966ee3c2f7fc43e9960bb903f4da29b (patch)
tree227edb2e1e9e78d911c05aeb8b7ce77e6f4c365a /src/lockmanager
parentfb9e3f9dbb17d3a606ff6aac9791b7a7ab436d56 (diff)
downloadgnunet-edf376bcc966ee3c2f7fc43e9960bb903f4da29b.tar.gz
gnunet-edf376bcc966ee3c2f7fc43e9960bb903f4da29b.zip
-quick and dirty use-after-free fix in LM
Diffstat (limited to 'src/lockmanager')
-rw-r--r--src/lockmanager/gnunet-service-lockmanager.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/lockmanager/gnunet-service-lockmanager.c b/src/lockmanager/gnunet-service-lockmanager.c
index 91e103aa0..56a9b6bc6 100644
--- a/src/lockmanager/gnunet-service-lockmanager.c
+++ b/src/lockmanager/gnunet-service-lockmanager.c
@@ -718,6 +718,32 @@ handle_release (void *cls, struct GNUNET_SERVER_Client *client,
718} 718}
719 719
720 720
721static int
722stop_lock_attempt (void *cls,
723 const struct GNUNET_HashCode *key,
724 void *value)
725{
726 struct ClientList *cl_entry = cls;
727 struct Lock *lock = value;
728 struct WaitList *wl;
729 struct WaitList *next;
730
731 next = lock->wl_head;
732 while (NULL != (wl = next))
733 {
734 next = wl->next;
735 if (wl->cl_entry == cl_entry)
736 {
737 GNUNET_CONTAINER_DLL_remove (lock->wl_head,
738 lock->wl_tail,
739 wl);
740 GNUNET_free (wl);
741 }
742 }
743 return GNUNET_OK;
744}
745
746
721/** 747/**
722 * Callback for client disconnect 748 * Callback for client disconnect
723 * 749 *
@@ -744,6 +770,9 @@ client_disconnect_cb (void *cls, struct GNUNET_SERVER_Client *client)
744 cl_ll_remove_lock (cl_entry, ll_entry); 770 cl_ll_remove_lock (cl_entry, ll_entry);
745 process_lock_release (lock); 771 process_lock_release (lock);
746 } 772 }
773 GNUNET_CONTAINER_multihashmap_iterate (lock_map,
774 &stop_lock_attempt,
775 cl_entry);
747 cl_remove_client (cl_entry); 776 cl_remove_client (cl_entry);
748} 777}
749 778