ubusd: handle invoke on event object without data
authorErik Karlsson <erik.karlsson@genexis.eu>
Fri, 2 Jul 2021 16:25:05 +0000 (18:25 +0200)
committerDaniel Golle <daniel@makrotopia.org>
Wed, 1 Jun 2022 21:17:59 +0000 (22:17 +0100)
When a built-in object is invoked with UBUS_ATTR_DATA absent, recv_msg
will be called with NULL as the msg argument and ubusd_forward_event
and ubusd_alloc_event_pattern need to handle this. Otherwise, a
truncated invoke of "send" or "register" on UBUS_SYSTEM_OBJECT_EVENT
that is missing UBUS_ATTR_DATA will cause ubusd to crash with SIGSEGV.

Signed-off-by: Erik Karlsson <erik.karlsson@genexis.eu>
ubusd_event.c

index ef433f81a71ec6395eb5d40df32c928233db6cb2..15932a9f4535a110d89962cc5dc7b54face60382 100644 (file)
@@ -63,6 +63,9 @@ static int ubusd_alloc_event_pattern(struct ubus_client *cl, struct blob_attr *m
        bool partial = false;
        int len;
 
+       if (!msg)
+               return UBUS_STATUS_INVALID_ARGUMENT;
+
        blobmsg_parse(evr_policy, EVREG_LAST, attr, blob_data(msg), blob_len(msg));
        if (!attr[EVREG_OBJECT] || !attr[EVREG_PATTERN])
                return UBUS_STATUS_INVALID_ARGUMENT;
@@ -209,6 +212,9 @@ static int ubusd_forward_event(struct ubus_client *cl, struct blob_attr *msg)
        struct blob_attr *attr[EVMSG_LAST];
        const char *id;
 
+       if (!msg)
+               return UBUS_STATUS_INVALID_ARGUMENT;
+
        blobmsg_parse(ev_policy, EVMSG_LAST, attr, blob_data(msg), blob_len(msg));
        if (!attr[EVMSG_ID] || !attr[EVMSG_DATA])
                return UBUS_STATUS_INVALID_ARGUMENT;