summaryrefslogtreecommitdiffstats
path: root/src/common/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/plugin.c')
-rw-r--r--src/common/plugin.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/common/plugin.c b/src/common/plugin.c
index 86fd8449..0aa8859d 100644
--- a/src/common/plugin.c
+++ b/src/common/plugin.c
@@ -541,10 +541,13 @@ static int
plugin_hook_run (session *sess, char *name, char *word[], char *word_eol[],
hexchat_event_attrs *attrs, int type)
{
+ /* fix segfault https://github.com/hexchat/hexchat/issues/2265 */
+ static int depth = 0;
GSList *list, *next;
hexchat_hook *hook;
int ret, eat = 0;
+ depth++;
list = hook_list;
while (1)
{
@@ -590,18 +593,22 @@ plugin_hook_run (session *sess, char *name, char *word[], char *word_eol[],
}
xit:
- /* really remove deleted hooks now */
- list = hook_list;
- while (list)
+ depth--;
+ if (!depth)
{
- hook = list->data;
- next = list->next;
- if (!hook || hook->type == HOOK_DELETED)
+ /* really remove deleted hooks now */
+ list = hook_list;
+ while (list)
{
- hook_list = g_slist_remove (hook_list, hook);
- g_free (hook);
+ hook = list->data;
+ next = list->next;
+ if (!hook || hook->type == HOOK_DELETED)
+ {
+ hook_list = g_slist_remove (hook_list, hook);
+ g_free (hook);
+ }
+ list = next;
}
- list = next;
}
return eat;