From d63884b0c701a24f3bfdded036c5d5b6b2b6bd0d Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Date: Mon, 24 Oct 2011 16:04:09 -0400 Subject: scanner: Catch more invalid attribute combinations for arg Spotted by Jakob Bornecrantz. --- protocol/wayland.xml | 2 +- src/scanner.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/protocol/wayland.xml b/protocol/wayland.xml index e1d11cb..1db72d9 100644 --- a/protocol/wayland.xml +++ b/protocol/wayland.xml @@ -66,7 +66,7 @@ server will always announce an object before the object sends out events. --> - + diff --git a/src/scanner.c b/src/scanner.c index 4cce808..c03597c 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -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) { -- cgit v1.2.3