Blame SOURCES/0008-util-sss_ptr_hash-fixed-double-free-in-sss_ptr_hash_.patch

0d441c
From 26e33b1984cce3549df170f58f8221201ad54cfd Mon Sep 17 00:00:00 2001
0d441c
From: Alexey Tikhonov <atikhono@redhat.com>
0d441c
Date: Tue, 7 Jan 2020 16:29:05 +0100
0d441c
Subject: [PATCH] util/sss_ptr_hash: fixed double free in
0d441c
 sss_ptr_hash_delete_cb()
0d441c
MIME-Version: 1.0
0d441c
Content-Type: text/plain; charset=UTF-8
0d441c
Content-Transfer-Encoding: 8bit
0d441c
0d441c
Calling data->callback(value->ptr) in sss_ptr_hash_delete_cb() could lead
0d441c
to freeing of value->ptr and thus to destruction of value->spy that is
0d441c
attached to value->ptr.
0d441c
In turn sss_ptr_hash_spy_destructor() calls sss_ptr_hash_delete() ->
0d441c
hash_delete() -> sss_ptr_hash_delete_cb() again and in this recursive
0d441c
execution hash entry was actually deleted and value was freed.
0d441c
When stack was unwound back to "first" sss_ptr_hash_delete_cb() it tried
0d441c
to free value again => double free.
0d441c
0d441c
To prevent this bug value and hence spy are now freed before execution of
0d441c
data->callback(value->ptr).
0d441c
0d441c
Resolves: https://pagure.io/SSSD/sssd/issue/4135
0d441c
0d441c
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
0d441c
---
0d441c
 src/util/sss_ptr_hash.c | 6 +++---
0d441c
 1 file changed, 3 insertions(+), 3 deletions(-)
0d441c
0d441c
diff --git a/src/util/sss_ptr_hash.c b/src/util/sss_ptr_hash.c
0d441c
index c7403ffa6..8f9762cb9 100644
0d441c
--- a/src/util/sss_ptr_hash.c
0d441c
+++ b/src/util/sss_ptr_hash.c
0d441c
@@ -154,13 +154,13 @@ sss_ptr_hash_delete_cb(hash_entry_t *item,
0d441c
     callback_entry.value.type = HASH_VALUE_PTR;
0d441c
     callback_entry.value.ptr = value->ptr;
0d441c
 
0d441c
+    /* Free value, this also will disable spy */
0d441c
+    talloc_free(value);
0d441c
+
0d441c
     /* Switch to the input value and call custom callback. */
0d441c
     if (data->callback != NULL) {
0d441c
         data->callback(&callback_entry, deltype, data->pvt);
0d441c
     }
0d441c
-
0d441c
-    /* Free value. */
0d441c
-    talloc_free(value);
0d441c
 }
0d441c
 
0d441c
 hash_table_t *sss_ptr_hash_create(TALLOC_CTX *mem_ctx,
0d441c
-- 
0d441c
2.20.1
0d441c