From 0bc24131135dfc04a09ffb9622e0d18a76c2e176 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 29 Sep 2008 17:07:50 +0000 Subject: [PATCH] Fix prev pointer during stringshare_del. SVN revision: 36319 --- legacy/eina/src/lib/eina_stringshare.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/legacy/eina/src/lib/eina_stringshare.c b/legacy/eina/src/lib/eina_stringshare.c index cb05fd4e25..494c6f3947 100644 --- a/legacy/eina/src/lib/eina_stringshare.c +++ b/legacy/eina/src/lib/eina_stringshare.c @@ -112,6 +112,7 @@ struct _Eina_Stringshare_Head { EINA_RBTREE; EINA_MAGIC; + int hash; Eina_Stringshare_Node *head; @@ -310,23 +311,24 @@ eina_stringshare_add(const char *str) hash &= EINA_STRINGSHARE_MASK; ed = (Eina_Stringshare_Head*) eina_rbtree_inline_lookup((Eina_Rbtree*) share->buckets[hash_num], - &hash, sizeof (hash), + &hash, 0, EINA_RBTREE_CMP_KEY_CB(_eina_stringshare_cmp), NULL); if (!ed) { ed = malloc(sizeof (Eina_Stringshare_Head) + sizeof (Eina_Stringshare_Node) + slen); if (!ed) return NULL; + EINA_MAGIC_SET(ed, EINA_MAGIC_STRINGSHARE_HEAD); + ed->hash = hash; ed->head = NULL; - EINA_MAGIC_SET(ed, EINA_MAGIC_STRINGSHARE_HEAD); - share->buckets[hash_num] = (Eina_Stringshare_Head*) eina_rbtree_inline_insert((Eina_Rbtree*) share->buckets[hash_num], EINA_RBTREE_GET(ed), EINA_RBTREE_CMP_NODE_CB(_eina_stringshare_node), NULL); nel = (Eina_Stringshare_Node*) (ed + 1); EINA_MAGIC_SET(nel, EINA_MAGIC_STRINGSHARE_NODE); + nel->begin = EINA_TRUE; } @@ -354,9 +356,9 @@ eina_stringshare_add(const char *str) { nel = malloc(sizeof (Eina_Stringshare_Node) + slen); if (!nel) return NULL; - nel->begin = EINA_FALSE; - EINA_MAGIC_SET(nel, EINA_MAGIC_STRINGSHARE_NODE); + + nel->begin = EINA_FALSE; } nel->references = 1; @@ -395,7 +397,7 @@ eina_stringshare_del(const char *str) hash &= EINA_STRINGSHARE_MASK; ed = (Eina_Stringshare_Head*) eina_rbtree_inline_lookup(EINA_RBTREE_GET(share->buckets[hash_num]), - &hash, sizeof (hash), + &hash, 0, EINA_RBTREE_CMP_KEY_CB(_eina_stringshare_cmp), NULL); if (!ed) goto on_error; @@ -403,11 +405,13 @@ eina_stringshare_del(const char *str) for (prev = NULL, el = ed->head; el && (const char*) (el + 1) != str; - el = el->next) + prev = el, el = el->next) ; if (!el) goto on_error; + EINA_MAGIC_CHECK_STRINGSHARE_NODE(el); + el->references--; if (el->references == 0) {