diff --git a/sway/input/text_input.c b/sway/input/text_input.c
index 6bcd02341..e16724671 100644
--- a/sway/input/text_input.c
+++ b/sway/input/text_input.c
@@ -454,6 +454,7 @@ static void handle_im_popup_surface_unmap(struct wl_listener *listener, void *da
 	struct sway_input_popup *popup =
 		wl_container_of(listener, popup, popup_surface_unmap);
 
+	scene_descriptor_destroy(&popup->scene_tree->node, SWAY_SCENE_DESC_POPUP);
 	// relative should already be freed as it should be a child of the just unmapped scene
 	popup->desc.relative = NULL;
 
diff --git a/sway/scene_descriptor.c b/sway/scene_descriptor.c
index a30d46646..92bdda00c 100644
--- a/sway/scene_descriptor.c
+++ b/sway/scene_descriptor.c
@@ -39,6 +39,9 @@ void *scene_descriptor_try_get(struct wlr_scene_node *node,
 void scene_descriptor_destroy(struct wlr_scene_node *node,
 		enum sway_scene_descriptor_type type) {
 	struct scene_descriptor *desc = scene_node_get_descriptor(node, type);
+	if (!desc) {
+		return;
+	}
 	descriptor_destroy(desc);
 }