From 06385ab79ef4b40d378088f20e8d8bc426a4f7bb Mon Sep 17 00:00:00 2001
From: Jens Nolte <git@queezle.net>
Date: Wed, 15 Sep 2021 23:24:44 +0200
Subject: [PATCH] Limit 'object'-attributes without interface to
 wl_display.error

---
 src/Quasar/Wayland/Protocol/TH.hs | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs
index cb94e96..7a1e636 100644
--- a/src/Quasar/Wayland/Protocol/TH.hs
+++ b/src/Quasar/Wayland/Protocol/TH.hs
@@ -342,10 +342,13 @@ parseMessage interfaceName (opcode, element) = do
   name <- getAttr "name" element
   since <- read <<$>> peekAttr "since" element
   arguments <- mapM parseArgument $ zip [0..] $ findChildren (qname "arg") element
-  forM_ arguments \arg ->
+  forM_ arguments \arg -> do
     when
-      do arg.argType == GenericNewIdArgument && interfaceName /= "wl_registry"
-      do fail $ "Invalid GenericNewIdArgument encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_registry)"
+      do arg.argType == GenericNewIdArgument && (interfaceName /= "wl_registry" || name /= "bind")
+      do fail $ "Invalid 'new_id' argument without 'interface' attribute encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_registry.bind)"
+    when
+      do arg.argType == GenericObjectArgument && (interfaceName /= "wl_display" || name /= "error")
+      do fail $ "Invalid 'object' argument without 'interface' attribute encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_display.error)"
   pure MessageSpec  {
     name,
     since,
-- 
GitLab