From 32e53bfde0214607a16588576f352b7f19e07199 Mon Sep 17 00:00:00 2001 From: Bert Massop Date: Sat, 3 Sep 2016 22:13:41 +0200 Subject: [PATCH 1/2] Fix list corruption resulting in segfault Entries were memset() to zero to erase them on eventUpdate, unintentionally erasing the list member and corrupting the list they are contained in. This resets the list member to its original value after all members have been zeroed. --- events.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/events.c b/events.c index 3ccaae0..2303bba 100644 --- a/events.c +++ b/events.c @@ -59,6 +59,15 @@ static void event_free_items(struct event_t* event) free(event->episodeUri); } +// Clears the contents of an event, but does not remove it from the list. +static void event_clear(struct event_t* event) +{ + event_free_items(event); + struct list_head tmp = event->list; + memset(event, 0, sizeof(event)); + event->list = tmp; +} + void event_free(struct event_t* event) { if (!event) @@ -97,8 +106,7 @@ void process_event_message(char* method, struct htsp_message_t* msg) fprintf(stderr,"WARNING: eventUpdate received for non-existent event %d, adding instead.\n",eventId); } } else { - event_free_items(event); - memset(event,0,sizeof(event)); + event_clear(event); if (strcmp(method,"eventAdd")==0) { fprintf(stderr,"WARNING: eventAdd received for existing event %d, updating instead.\n",eventId); } From 00e9cd5ebdab0b6d6345f98b8b36ba65ac09dd95 Mon Sep 17 00:00:00 2001 From: Bert Massop Date: Sat, 3 Sep 2016 22:27:30 +0200 Subject: [PATCH 2/2] Clear the entire event, not just its first bytes --- events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/events.c b/events.c index 2303bba..70799e3 100644 --- a/events.c +++ b/events.c @@ -64,7 +64,7 @@ static void event_clear(struct event_t* event) { event_free_items(event); struct list_head tmp = event->list; - memset(event, 0, sizeof(event)); + memset(event, 0, sizeof(struct event_t)); event->list = tmp; }