scanner: Catch more invalid attribute combinations for arg
authorKristian Høgsberg <krh@bitplanet.net>
Mon, 24 Oct 2011 20:04:09 +0000 (16:04 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 24 Oct 2011 20:04:09 +0000 (16:04 -0400)
Spotted by Jakob Bornecrantz.

protocol/wayland.xml
src/scanner.c

index e1d11cb..1db72d9 100644 (file)
@@ -66,7 +66,7 @@
          server will always announce an object before the object sends
          out events. -->
     <event name="global">
-      <arg name="name" type="uint" interface="wl_object"/>
+      <arg name="name" type="uint"/>
       <arg name="interface" type="string"/>
       <arg name="version" type="uint"/>
     </event>
index 4cce808..c03597c 100644 (file)
@@ -230,19 +230,27 @@ start_element(void *data, const char *element_name, const char **atts)
                else if (strcmp(type, "fd") == 0)
                        arg->type = FD;
                else if (strcmp(type, "new_id") == 0) {
-                       if (interface_name == NULL)
-                               fail(ctx, "no interface name given");
                        arg->type = NEW_ID;
                        arg->interface_name = strdup(interface_name);
                } else if (strcmp(type, "object") == 0) {
-                       if (interface_name == NULL)
-                               fail(ctx, "no interface name given");
                        arg->type = OBJECT;
                        arg->interface_name = strdup(interface_name);
                } else {
                        fail(ctx, "unknown type");
                }
 
+               switch (arg->type) {
+               case NEW_ID:
+               case OBJECT:
+                       if (interface_name == NULL)
+                               fail(ctx, "no interface name given");
+                       break;
+               default:
+                       if (interface_name != NULL)
+                               fail(ctx, "interface no allowed");
+                       break;
+               }
+
                wl_list_insert(ctx->message->arg_list.prev, &arg->link);
                ctx->message->arg_count++;
        } else if (strcmp(element_name, "enum") == 0) {