<div dir="ltr"><span style="font-size:13px;line-height:19.5px">Hi Felix,</span><div style="font-size:13px;line-height:19.5px"><br></div><div style="font-size:13px;line-height:19.5px">Thanks for the quick reply! (sorry for the previous top post...)</div><div style="font-size:13px;line-height:19.5px"><br></div><div style="font-size:13px;line-height:19.5px"><span style="line-height:20px;font-size:small">On Mon, Feb 15, 2016 at 1:24 PM Felix Fietkau <<a href="mailto:nbd@openwrt.org">nbd@openwrt.org</a>> wrote:</span><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 2016-02-15 12:19, Eyal Birger wrote:<br>
> Hi Felix,<br>
><br>
> Thanks for your review!<br>
><br>
> If I understood the code correctly, the header fields are never accessed<br>
> before the header is fully received - at which point the conversion is done.<br>
> My motivation for changing the fields only as they are sent on the wire<br>
> is to avoid renaming the fields or changing their semantics to avoid<br>
> backporting messes...<br>
><br>
> Could you elaborate on the corner cases? are there any tests I can run<br>
> to verify them?<br>
><br>
> Thanks again!<br>
> Eyal.<br>
><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>
<br></blockquote><div><br></div><div><div style="font-size:13px;line-height:19.5px">Interesting... I initialize the iov_base every time to a newly created and</div><div style="font-size:13px;line-height:19.5px">calculated hdr variable before the sendmsg() call, and iov is never used</div><div style="font-size:13px;line-height:19.5px">otherwise - so I wonder how it <span style="line-height:1.5">could be reused in subsequent calls?</span></div><br><div class="gmail_quote"></div></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>