From 0967e9eb858c9f47b44719b990cef3f4efc640ef Mon Sep 17 00:00:00 2001 From: Vftdan Date: Mon, 19 Aug 2024 21:12:12 +0200 Subject: [PATCH] Prevent sparse output connector list from causing disowned events --- nodes/assign.c | 5 +++++ nodes/differentiate.c | 5 +++++ nodes/modifiers.c | 5 +++++ nodes/router.c | 6 +++++- nodes/scale.c | 5 +++++ nodes/tee.c | 5 +++++ 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/nodes/assign.c b/nodes/assign.c index fb56b8e..164dd18 100644 --- a/nodes/assign.c +++ b/nodes/assign.c @@ -35,6 +35,11 @@ handle_event(EventPositionBase * self, EventNode * event) } for (size_t i = 0; i < count; ++i) { event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; + if (!event->position) { + EventNode *orphaned = event; + event = orphaned->prev; + event_destroy(orphaned); + } event = event->next; } return true; diff --git a/nodes/differentiate.c b/nodes/differentiate.c index 61a47ea..5f68baf 100644 --- a/nodes/differentiate.c +++ b/nodes/differentiate.c @@ -25,6 +25,11 @@ handle_event(EventPositionBase * self, EventNode * event) } for (size_t i = 0; i < count; ++i) { event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; + if (!event->position) { + EventNode *orphaned = event; + event = orphaned->prev; + event_destroy(orphaned); + } event = event->next; } return true; diff --git a/nodes/modifiers.c b/nodes/modifiers.c index d034a00..844a90c 100644 --- a/nodes/modifiers.c +++ b/nodes/modifiers.c @@ -22,6 +22,11 @@ handle_event(EventPositionBase * self, EventNode * event) } for (size_t i = 0; i < count; ++i) { event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; + if (!event->position) { + EventNode *orphaned = event; + event = orphaned->prev; + event_destroy(orphaned); + } event = event->next; } return true; diff --git a/nodes/router.c b/nodes/router.c index 4214a8c..5c44377 100644 --- a/nodes/router.c +++ b/nodes/router.c @@ -17,7 +17,11 @@ handle_event(EventPositionBase * self, EventNode * event) } if (event_predicate_apply(node->predicates[i], event) == EVPREDRES_ACCEPTED) { if (event_replicate(event, 1)) { - event->next->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; + EventNode * replica = event->next; + replica->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; + if (!replica->position) { + event_destroy(replica); + } } } } diff --git a/nodes/scale.c b/nodes/scale.c index 46352ee..3ab8da0 100644 --- a/nodes/scale.c +++ b/nodes/scale.c @@ -39,6 +39,11 @@ handle_event(EventPositionBase * self, EventNode * event) } for (size_t i = 0; i < count; ++i) { event->position = &node->as_GraphNode.outputs.elements[i]->as_EventPositionBase; + if (!event->position) { + EventNode *orphaned = event; + event = orphaned->prev; + event_destroy(orphaned); + } event = event->next; } return true; diff --git a/nodes/tee.c b/nodes/tee.c index a098e33..acbe779 100644 --- a/nodes/tee.c +++ b/nodes/tee.c @@ -15,6 +15,11 @@ handle_event(EventPositionBase * self, EventNode * event) } for (size_t i = 0; i < count; ++i) { event->position = &node->outputs.elements[i]->as_EventPositionBase; + if (!event->position) { + EventNode *orphaned = event; + event = orphaned->prev; + event_destroy(orphaned); + } event = event->next; } return true;