summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Karlsson <erik.karlsson@genexis.eu>2021-07-02 18:25:05 +0200
committerDaniel Golle <daniel@makrotopia.org>2022-06-01 22:17:59 +0100
commit2bebf93cd3343fe49f22a05ef935e460d2d44f67 (patch)
tree138422ec6f73bb35f38f0ea2a2b12335b6f96ae2
parent2f793a4eb063128d80fc46ada243d2aad47fd1fe (diff)
downloadubus-2bebf93cd3343fe49f22a05ef935e460d2d44f67.tar.gz
ubusd: handle invoke on event object without data
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>
-rw-r--r--ubusd_event.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/ubusd_event.c b/ubusd_event.c
index ef433f8..15932a9 100644
--- a/ubusd_event.c
+++ b/ubusd_event.c
@@ -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;