From: Felix Fietkau Date: Wed, 25 Jul 2018 08:37:30 +0000 (+0200) Subject: libubus: check for non-NULL data before running callbacks X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=884be451622d21fe3a7b06cc5b9d245bc4fffbf2;p=oweals%2Fubus.git 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 --- diff --git a/libubus-obj.c b/libubus-obj.c index c1931b3..2580b24 100644 --- a/libubus-obj.c +++ b/libubus-obj.c @@ -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]); diff --git a/libubus-req.c b/libubus-req.c index 92f80fa..4eda383 100644 --- a/libubus-req.c +++ b/libubus-req.c @@ -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]); }