<div dir="ltr">Hello Marc-André,<br><div class="gmail_extra"><br><div class="gmail_quote">2017-01-09 20:43 GMT+08:00 Marc-André Lureau <span dir="ltr"><<a href="mailto:mlureau@redhat.com" target="_blank">mlureau@redhat.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi<br>
<span class="gmail-"><br>
----- Original Message -----<br>
> As the 'pkt_length' and 'offlen' can be malicious from guest,<br>
> the vrend_create_shader function has an integer overflow, this<br>
> will make the next 'memcpy' oob access. This patch avoid this.<br>
><br>
> Signed-off-by: Li Qiang <<a href="mailto:liq3ea@gmail.com">liq3ea@gmail.com</a>><br>
> ---<br>
>  src/vrend_renderer.c | 9 +++++++++<br>
>  1 file changed, 9 insertions(+)<br>
><br>
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c<br>
> index 00b61eb..a92bc83 100644<br>
> --- a/src/vrend_renderer.c<br>
> +++ b/src/vrend_renderer.c<br>
> @@ -2211,6 +2211,15 @@ int vrend_create_shader(struct vrend_context *ctx,<br>
>           ret = EINVAL;<br>
>           goto error;<br>
>        }<br>
> +<br>
> +      /*make sure no overflow */<br>
> +      if (pkt_length * 4 < pkt_length ||<br>
> +          pkt_length * 4 + sel->buf_offset < pkt_length * 4 ||<br>
> +          pkt_length * 4 + sel->buf_offset < sel->buf_offset) {<br>
> +            ret = EINVAL;<br>
> +            goto error;<br>
> +          }<br>
<br>
</span>That looks okay, wouldn't it be simpler to do the arithmetic on 64 bits instead?<br>
<div class="gmail-HOEnZb"><div class="gmail-h5"><br></div></div></blockquote><div><br></div><div>Right, this is a little complicated. But as the 'pkt_length' and 'sel->buf_offset' can both set by the guest.</div><div>I think this is the most safe way, avoid all the overflow.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-HOEnZb"><div class="gmail-h5">
> +<br>
>        if ((pkt_length * 4 + sel->buf_offset) > sel->buf_len) {<br>
>           fprintf(stderr, "Got too large shader continuation %d vs %d\n",<br>
>                   pkt_length * 4 + sel->buf_offset, sel->buf_len);<br>
> --<br>
> 2.7.4<br>
><br>
><br>
</div></div></blockquote></div><br></div></div>