diff --git a/client.h b/client.h
index 49982e0..38330d5 100644
--- a/client.h
+++ b/client.h
@@ -304,7 +304,9 @@ toplevel_from_popup(struct wlr_xdg_popup *popup)
 	while (1) {
 		switch (surface->role) {
 		case WLR_XDG_SURFACE_ROLE_POPUP:
-			if (wlr_surface_is_layer_surface(surface->popup->parent))
+			if (!surface->popup->parent)
+				return NULL;
+			else if (wlr_surface_is_layer_surface(surface->popup->parent))
 				return wlr_layer_surface_v1_from_wlr_surface(surface->popup->parent)->data;
 			else if (!wlr_surface_is_xdg_surface(surface->popup->parent))
 				return NULL;
diff --git a/dwl.c b/dwl.c
index 52bfa58..5ee3c92 100644
--- a/dwl.c
+++ b/dwl.c
@@ -1016,6 +1016,8 @@ createnotify(struct wl_listener *listener, void *data)
 	if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
 		struct wlr_box box;
 		LayerSurface *l = toplevel_from_popup(xdg_surface->popup);
+		if (!xdg_surface->popup->parent)
+			return;
 		xdg_surface->surface->data = wlr_scene_xdg_surface_create(
 				xdg_surface->popup->parent->data, xdg_surface);
 		/* Probably the check of `l` is useless, the only thing that can be NULL