From 9562291f688afb5c32cfbd918812e0fc560e5d63 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 15 Sep 2014 15:40:05 +0200 Subject: [PATCH] libubus: preserve the received message buffer for incoming invoke calls Set ctx->msgbuf.data to NULL during the call. If ctx->msgbuf is needed during the call, a new buffer will be allocated. If not, ctx->msgbuf.data is restored to the previous value afterwards Signed-off-by: Felix Fietkau --- libubus-obj.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libubus-obj.c b/libubus-obj.c index ef10462..8bc83dc 100644 --- a/libubus-obj.c +++ b/libubus-obj.c @@ -99,6 +99,7 @@ void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr_ struct blob_attr **attrbuf; struct ubus_object *obj; uint32_t objid; + void *prev_data = NULL; attrbuf = ubus_parse_msg(buf->data); if (!attrbuf[UBUS_ATTR_OBJID]) @@ -120,7 +121,20 @@ void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr_ default: return; } + + if (buf == &ctx->msgbuf) { + prev_data = buf->data; + buf->data = NULL; + } + cb(ctx, hdr, obj, attrbuf); + + if (prev_data) { + if (buf->data) + free(prev_data); + else + buf->data = prev_data; + } } static void ubus_add_object_cb(struct ubus_request *req, int type, struct blob_attr *msg) -- 2.11.0