- iov.iov_len = blob_len(ubus_msghdr_data(&ctx->msgbuf.hdr));
- if (iov.iov_len > 0 && !recv_retry(ctx->sock.fd, &iov, true, NULL))
+ hdrbuf.hdr.seq = be16_to_cpu(hdrbuf.hdr.seq);
+ hdrbuf.hdr.peer = be32_to_cpu(hdrbuf.hdr.peer);
+
+ if (!ubus_validate_hdr(&hdrbuf.hdr))
+ return false;
+
+ len = blob_raw_len(&hdrbuf.data);
+ if (!alloc_msg_buf(ctx, len))
+ 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) <= 0)