X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=libubus-obj.c;h=8bc83dc62cfd163f32702ebc13605d9067400259;hp=47bdb0a4e758683a4c044b4e56dfa1968b8d4acc;hb=7b79b6226e737e28aafb4e9b668b86b5f180314b;hpb=2c71017cfb1d370abd1b52b3f59874e253914684 diff --git a/libubus-obj.c b/libubus-obj.c index 47bdb0a..8bc83dc 100644 --- a/libubus-obj.c +++ b/libubus-obj.c @@ -91,15 +91,17 @@ send: ubus_complete_deferred_request(ctx, &req, ret); } -void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr *hdr) +void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr_buf *buf) { void (*cb)(struct ubus_context *, struct ubus_msghdr *, struct ubus_object *, struct blob_attr **); + struct ubus_msghdr *hdr = &buf->hdr; struct blob_attr **attrbuf; struct ubus_object *obj; uint32_t objid; + void *prev_data = NULL; - attrbuf = ubus_parse_msg(ubus_msghdr_data(hdr)); + attrbuf = ubus_parse_msg(buf->data); if (!attrbuf[UBUS_ATTR_OBJID]) return; @@ -119,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)