X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=libubus-io.c;h=c63a9201cd713256ed6616b75427ff4f9087034e;hb=7e746e5a850b1c5ef87b8d8538e921f2051f5471;hp=9a6c7cd77ec168be2b6779fc9fe05aea751c0fa2;hpb=1d5ac421a5b3dca60562e876ba70d0c2fe46b3d2;p=project%2Fubus.git diff --git a/libubus-io.c b/libubus-io.c index 9a6c7cd..c63a920 100644 --- a/libubus-io.c +++ b/libubus-io.c @@ -212,7 +212,7 @@ static int recv_retry(int fd, struct iovec *iov, bool wait, int *recv_fd) static bool ubus_validate_hdr(struct ubus_msghdr *hdr) { - struct blob_attr *data = ubus_msghdr_data(hdr); + struct blob_attr *data = (struct blob_attr *) (hdr + 1); if (hdr->version != 0) return false; @@ -228,11 +228,14 @@ static bool ubus_validate_hdr(struct ubus_msghdr *hdr) static bool get_next_msg(struct ubus_context *ctx, int *recv_fd) { - struct iovec iov = STATIC_IOV(ctx->msgbuf.hdr); + struct { + struct ubus_msghdr hdr; + struct blob_attr data; + } hdrbuf; + struct iovec iov = STATIC_IOV(hdrbuf); int r; /* receive header + start attribute */ - iov.iov_len += sizeof(struct blob_attr); r = recv_retry(ctx->sock.fd, &iov, false, recv_fd); if (r <= 0) { if (r < 0) @@ -241,11 +244,18 @@ static bool get_next_msg(struct ubus_context *ctx, int *recv_fd) return false; } - iov.iov_len = blob_len(ubus_msghdr_data(&ctx->msgbuf.hdr)); + if (!ubus_validate_hdr(&hdrbuf.hdr)) + return false; + + memcpy(&ctx->msgbuf.hdr, &hdrbuf.hdr, sizeof(hdrbuf.hdr)); + memcpy(ctx->msgbuf.data, &hdrbuf.data, sizeof(hdrbuf.data)); + + iov.iov_base = (char *)ctx->msgbuf.data + sizeof(hdrbuf.data); + iov.iov_len = blob_len(ctx->msgbuf.data); if (iov.iov_len > 0 && !recv_retry(ctx->sock.fd, &iov, true, NULL)) return false; - return ubus_validate_hdr(&ctx->msgbuf.hdr); + return true; } void __hidden ubus_handle_data(struct uloop_fd *u, unsigned int events)