diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-12-21 14:03:13 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-12-21 14:03:13 +0000 |
commit | edf376bcc966ee3c2f7fc43e9960bb903f4da29b (patch) | |
tree | 227edb2e1e9e78d911c05aeb8b7ce77e6f4c365a /src/lockmanager | |
parent | fb9e3f9dbb17d3a606ff6aac9791b7a7ab436d56 (diff) | |
download | gnunet-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.c | 29 |
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 | ||
721 | static int | ||
722 | stop_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 | ||