[SSSD] [PATCH] Do not delete requests inside hash_iterate loop

Jakub Hrozek jhrozek at redhat.com
Wed Aug 10 09:01:15 UTC 2011


This patch should solve #932/rhbz #725472, although I have not been able
to reproduce the original crash, so I'm not sure. But it's definitely
something we want to fix as deleting a hash table item from a
hash_iterate visitor callback yields potentially undefined results.
-------------- next part --------------
>From 015134620d33451606fec45093774a47570258c5 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek at redhat.com>
Date: Tue, 9 Aug 2011 21:56:34 +0200
Subject: [PATCH] Do not delete requests inside hash_iterate loop

---
 src/responder/common/responder_dp.c |   22 ++++++++++++----------
 1 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c
index 8050e06..a89425c 100644
--- a/src/responder/common/responder_dp.c
+++ b/src/responder/common/responder_dp.c
@@ -107,22 +107,24 @@ static int sss_dp_req_destructor(void *ptr)
     return 0;
 }
 
-static bool reconnect_handler(hash_entry_t *item, void *user_data)
-{
-    struct sss_dp_req *sdp_req = talloc_get_type(item->value.ptr,
-                                                 struct sss_dp_req);
-
-    return (talloc_free(sdp_req) == EOK ? true : false);
-}
-
 void handle_requests_after_reconnect(void)
 {
     int ret;
+    hash_value_t *values;
+    unsigned long count, i;
+    struct sss_dp_req *sdp_req;
 
-    ret = hash_iterate(dp_requests, reconnect_handler, NULL);
+    ret = hash_values(dp_requests, &count, &values);
     if (ret != HASH_SUCCESS) {
-        DEBUG(1, ("hash_iterate failed, "
+        DEBUG(1, ("hash_values failed, "
                   "not all request might be handled after reconnect.\n"));
+        return;
+    }
+
+    DEBUG(7, ("Will handle %lu requests after reconnect\n", count));
+    for (i=0; i<count; i++) {
+        sdp_req = talloc_get_type(values[i].ptr, struct sss_dp_req);
+        talloc_free(sdp_req);
     }
 }
 
-- 
1.7.6



More information about the sssd-devel mailing list