forked from enlightenment/efl
edje - signal callback matches/patterns try fix number 2
so i think there was also another bug as i saw this again now. this should hopefully plug the signal/mtach memory bugs now by removing and adding back to hash as the hash key relies on the memory addresses of signal/src in the matches array which change on realloc. a bit brute-forceey but... better than crashes. @fix
This commit is contained in:
parent
0d27de4022
commit
c348e7779c
|
@ -68,12 +68,10 @@ _edje_signal_callback_matches_dup(const Edje_Signal_Callback_Matches *src)
|
||||||
result = calloc(1, sizeof (Edje_Signal_Callback_Matches));
|
result = calloc(1, sizeof (Edje_Signal_Callback_Matches));
|
||||||
if (!result) return NULL;
|
if (!result) return NULL;
|
||||||
|
|
||||||
result->hashed = EINA_FALSE;
|
|
||||||
result->matches = malloc
|
result->matches = malloc
|
||||||
(sizeof(Edje_Signal_Callback_Match) * src->matches_count);
|
(sizeof(Edje_Signal_Callback_Match) * src->matches_count);
|
||||||
if (!result->matches) goto err;
|
if (!result->matches) goto err;
|
||||||
result->matches_count = src->matches_count;
|
result->matches_count = src->matches_count;
|
||||||
result->patterns = NULL;
|
|
||||||
EINA_REFCOUNT_REF(result);
|
EINA_REFCOUNT_REF(result);
|
||||||
|
|
||||||
if (src->free_cb)
|
if (src->free_cb)
|
||||||
|
@ -107,7 +105,6 @@ _edje_callbacks_patterns_clean(Edje_Signal_Callback_Group *gp)
|
||||||
Edje_Signal_Callback_Matches *tmp = (Edje_Signal_Callback_Matches *)gp->matches;
|
Edje_Signal_Callback_Matches *tmp = (Edje_Signal_Callback_Matches *)gp->matches;
|
||||||
|
|
||||||
if (!tmp) return;
|
if (!tmp) return;
|
||||||
assert(EINA_REFCOUNT_GET(tmp) == 1);
|
|
||||||
_edje_signal_callback_patterns_unref(tmp->patterns);
|
_edje_signal_callback_patterns_unref(tmp->patterns);
|
||||||
tmp->patterns = NULL;
|
tmp->patterns = NULL;
|
||||||
}
|
}
|
||||||
|
@ -220,6 +217,7 @@ _edje_signal_callback_grow(Edje_Signal_Callback_Group *gp)
|
||||||
m = realloc(tmp->matches, sizeof(Edje_Signal_Callback_Match) * tmp->matches_count);
|
m = realloc(tmp->matches, sizeof(Edje_Signal_Callback_Match) * tmp->matches_count);
|
||||||
if (!m) goto err;
|
if (!m) goto err;
|
||||||
tmp->matches = m;
|
tmp->matches = m;
|
||||||
|
memset(&(tmp->matches[tmp->matches_count - 1]), 0, sizeof(Edje_Signal_Callback_Match));
|
||||||
if (tmp->free_cb)
|
if (tmp->free_cb)
|
||||||
{
|
{
|
||||||
f = realloc(tmp->free_cb, sizeof(Eina_Free_Cb) * tmp->matches_count);
|
f = realloc(tmp->free_cb, sizeof(Eina_Free_Cb) * tmp->matches_count);
|
||||||
|
@ -230,9 +228,11 @@ _edje_signal_callback_grow(Edje_Signal_Callback_Group *gp)
|
||||||
cd = realloc(gp->custom_data, sizeof(void *) * tmp->matches_count);
|
cd = realloc(gp->custom_data, sizeof(void *) * tmp->matches_count);
|
||||||
if (!cd) goto err;
|
if (!cd) goto err;
|
||||||
gp->custom_data = cd;
|
gp->custom_data = cd;
|
||||||
|
gp->custom_data[tmp->matches_count - 1] = NULL;
|
||||||
fl = realloc(gp->flags, sizeof(Edje_Signal_Callback_Flags) * tmp->matches_count);
|
fl = realloc(gp->flags, sizeof(Edje_Signal_Callback_Flags) * tmp->matches_count);
|
||||||
if (!fl) goto err;
|
if (!fl) goto err;
|
||||||
gp->flags = fl;
|
gp->flags = fl;
|
||||||
|
memset(&(gp->flags[tmp->matches_count - 1]), 0, sizeof(Edje_Signal_Callback_Flags));
|
||||||
return gp;
|
return gp;
|
||||||
err:
|
err:
|
||||||
ERR("Allocation error in rowing signal callback group");
|
ERR("Allocation error in rowing signal callback group");
|
||||||
|
@ -285,7 +285,6 @@ _edje_signal_callback_push(Edje_Signal_Callback_Group *gp,
|
||||||
}
|
}
|
||||||
gp->matches = tmp = tmp_dup;
|
gp->matches = tmp = tmp_dup;
|
||||||
}
|
}
|
||||||
assert(tmp->hashed == EINA_FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// search an empty spot now
|
// search an empty spot now
|
||||||
|
@ -300,6 +299,8 @@ _edje_signal_callback_push(Edje_Signal_Callback_Group *gp,
|
||||||
}
|
}
|
||||||
|
|
||||||
m = tmp->matches;
|
m = tmp->matches;
|
||||||
|
if (tmp->hashed)
|
||||||
|
eina_hash_del(signal_match, tmp, tmp);
|
||||||
if (_edje_signal_callback_grow(gp))
|
if (_edje_signal_callback_grow(gp))
|
||||||
{
|
{
|
||||||
// Set propagate and just_added flags
|
// Set propagate and just_added flags
|
||||||
|
@ -310,8 +311,15 @@ _edje_signal_callback_push(Edje_Signal_Callback_Group *gp,
|
||||||
_edje_callbacks_patterns_clean(gp);
|
_edje_callbacks_patterns_clean(gp);
|
||||||
_edje_callbacks_patterns_init(gp);
|
_edje_callbacks_patterns_init(gp);
|
||||||
}
|
}
|
||||||
|
if (tmp->hashed)
|
||||||
|
eina_hash_add(signal_match, tmp, tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tmp->hashed)
|
||||||
|
eina_hash_add(signal_match, tmp, tmp);
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
else goto err;
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
err:
|
err:
|
||||||
ERR("Allocation error in pushing callback");
|
ERR("Allocation error in pushing callback");
|
||||||
|
@ -355,19 +363,22 @@ _edje_signal_callback_matches_unref(Edje_Signal_Callback_Matches *m,
|
||||||
|
|
||||||
EINA_REFCOUNT_UNREF(m)
|
EINA_REFCOUNT_UNREF(m)
|
||||||
{
|
{
|
||||||
_edje_signal_callback_patterns_unref(m->patterns);
|
|
||||||
if (m->hashed)
|
if (m->hashed)
|
||||||
eina_hash_del(signal_match, m, m);
|
eina_hash_del(signal_match, m, m);
|
||||||
for (i = 0; i < m->matches_count; ++i)
|
for (i = 0; i < m->matches_count; ++i)
|
||||||
{
|
{
|
||||||
eina_stringshare_del(m->matches[i].signal);
|
eina_stringshare_del(m->matches[i].signal);
|
||||||
eina_stringshare_del(m->matches[i].source);
|
eina_stringshare_del(m->matches[i].source);
|
||||||
|
m->matches[i].signal = NULL;
|
||||||
|
m->matches[i].source = NULL;
|
||||||
}
|
}
|
||||||
|
_edje_signal_callback_patterns_unref(m->patterns);
|
||||||
free(m->matches);
|
free(m->matches);
|
||||||
free(m->free_cb);
|
free(m->free_cb);
|
||||||
m->hashed = EINA_FALSE;
|
m->patterns = NULL;
|
||||||
m->matches = NULL;
|
m->matches = NULL;
|
||||||
m->free_cb = NULL;
|
m->free_cb = NULL;
|
||||||
|
m->hashed = EINA_FALSE;
|
||||||
free(m);
|
free(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -458,7 +469,7 @@ _edje_signal_callback_patterns_ref(const Edje_Signal_Callback_Group *gp)
|
||||||
tmp = (Edje_Signal_Callback_Matches *)gp->matches;
|
tmp = (Edje_Signal_Callback_Matches *)gp->matches;
|
||||||
if (!tmp) return NULL;
|
if (!tmp) return NULL;
|
||||||
if (tmp->hashed) goto got_it;
|
if (tmp->hashed) goto got_it;
|
||||||
m = eina_hash_find(signal_match, gp->matches);
|
m = eina_hash_find(signal_match, tmp);
|
||||||
if (!m)
|
if (!m)
|
||||||
{
|
{
|
||||||
if (!(tmp->patterns && (EINA_REFCOUNT_GET(tmp->patterns) > 1)))
|
if (!(tmp->patterns && (EINA_REFCOUNT_GET(tmp->patterns) > 1)))
|
||||||
|
|
Loading…
Reference in New Issue