<div dir="ltr">Hi Felix,<div><br></div><div>Thanks again for your responses.<br><div><br><div><div class="gmail_quote"><div dir="ltr">On Mon, Feb 15, 2016 at 2:14 PM Felix Fietkau <<a href="mailto:nbd@openwrt.org">nbd@openwrt.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 2016-02-15 12:54, Eyal Birger wrote:<br>
>     >     >       if (offset < sizeof(ub->hdr)) {<br>
>     >     > -             iov[0].iov_base = ((char *) &ub->hdr) + offset;<br>
>     >     > -             iov[0].iov_len = sizeof(ub->hdr) - offset;<br>
>     >     > +             struct ubus_msghdr hdr;<br>
>     >     > +<br>
>     >     > +             hdr.version = ub->hdr.version;<br>
>     >     > +             hdr.type = ub->hdr.type;<br>
>     >     > +             hdr.seq = cpu_to_be16(ub->hdr.seq);<br>
>     >     > +             hdr.peer = cpu_to_be32(ub->hdr.peer);<br>
>     >     > +<br>
>     >     > +             iov[0].iov_base = ((char *) &hdr) + offset;<br>
>     >     > +             iov[0].iov_len = sizeof(hdr) - offset;<br>
>     The corner case is this: You changed the iov to point at stack space<br>
>     instead of ub->hdr. If the code receives a part of the header in one<br>
>     call, and another one in the next (offset > 0), the contents of hdr will<br>
>     be corrupt, as it will be a mix of uninitialized stack space + the<br>
>     received data from the last call.<br>
> Interesting... I initialize the iov_base every time to a newly created and<br>
> calculated hdr variable before the sendmsg() call, and iov is never used<br>
> otherwise - so I wonder how it could be reused in subsequent calls?<br>
Before your change, iov[0].iov_base points at ub->hdr, which is on heap<br>
and is preserved across calls.<br>
After your change, iov[0].iov_base points at the on-stack struct hdr,<br>
which is not preserved across calls.<br>
<br></blockquote><div><br></div><div>The thing is, I don't see why the area pointed to in iov_base is required to be preserved between calls - the sendmsg() call never uses the cached values in iov. They are always re-armed with new pointers.<br></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
- Felix<br>
</blockquote></div></div></div></div></div>