libubus: check for non-NULL data before running callbacks

UBUS_MSG_INVOKE and UBUS_MSG_DATA can be sent without UBUS_ATTR_DATA
present. Most ubus users assume that the msg argument passed can never
be NULL, so this change prevents a crash

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2018-07-25 10:37:30 +02:00
parent 5bae22eb54
commit 884be45162
2 changed files with 9 additions and 1 deletions

View file

@ -74,7 +74,7 @@ ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr,
if (attrbuf[UBUS_ATTR_NO_REPLY])
no_reply = blob_get_int8(attrbuf[UBUS_ATTR_NO_REPLY]);
req.peer = hdr->peer;
req.seq = hdr->seq;
req.object = obj->id;
@ -94,6 +94,11 @@ ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr,
goto send;
found:
if (!attrbuf[UBUS_ATTR_DATA]) {
ret = UBUS_STATUS_INVALID_ARGUMENT;
goto send;
}
ret = obj->methods[method].handler(ctx, obj, &req,
blob_data(attrbuf[UBUS_ATTR_METHOD]),
attrbuf[UBUS_ATTR_DATA]);

View file

@ -32,6 +32,9 @@ static void req_data_cb(struct ubus_request *req, int type, struct blob_attr *da
return;
attr = ubus_parse_msg(data);
if (!attr[UBUS_ATTR_DATA])
return;
req->data_cb(req, type, attr[UBUS_ATTR_DATA]);
}