<div dir="ltr"><span style="font-size:12.8px;text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">virgl_renderer_get_cap_set() could return 0 in max_size, malloc(0) could return you a valid pointer (not null) which can be passed to free(), so, in this case you could overwrite memory. Probably, you'd better to check <span style="background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">max_size for a minimum valid size.</span></span></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 7, 2018 at 11:21 PM, Dave Airlie <span dir="ltr"><<a href="mailto:airlied@gmail.com" target="_blank">airlied@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Dave Airlie <<a href="mailto:airlied@redhat.com">airlied@redhat.com</a>><br>
<br>
I've come up with a workaround on the mesa side that should be<br>
backwards compatible with old vtests and vice-versa.<br>
<br>
It involves sending both caps 2 and 1 queries back to back,<br>
and taking the first response an indication of what to expect,<br>
---<br>
 vtest/vtest.h          |  2 +-<br>
 vtest/vtest_protocol.h |  2 ++<br>
 vtest/vtest_renderer.c | 28 ++++++++++++++++++++++++++++<br>
 vtest/vtest_server.c   |  3 +++<br>
 4 files changed, 34 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/vtest/vtest.h b/vtest/vtest.h<br>
index deb6618..327c193 100644<br>
--- a/vtest/vtest.h<br>
+++ b/vtest/vtest.h<br>
@@ -28,7 +28,7 @@<br>
 int vtest_create_renderer(int in_fd, int out_fd, uint32_t length);<br>
<br>
 int vtest_send_caps(void);<br>
-<br>
+int vtest_send_caps2(void);<br>
 int vtest_create_resource(void);<br>
 int vtest_resource_unref(void);<br>
 int vtest_submit_cmd(uint32_t length_dw);<br>
diff --git a/vtest/vtest_protocol.h b/vtest/vtest_protocol.h<br>
index 84fd3eb..f617643 100644<br>
--- a/vtest/vtest_protocol.h<br>
+++ b/vtest/vtest_protocol.h<br>
@@ -48,6 +48,8 @@<br>
<br>
 /* pass the process cmd line for debugging */<br>
 #define VCMD_CREATE_RENDERER 8<br>
+<br>
+#define VCMD_GET_CAPS2 9<br>
 /* get caps */<br>
 /* 0 length cmd */<br>
 /* resp VCMD_GET_CAPS + caps */<br>
diff --git a/vtest/vtest_renderer.c b/vtest/vtest_renderer.c<br>
index 3b8fe1a..e0e7d64 100644<br>
--- a/vtest/vtest_renderer.c<br>
+++ b/vtest/vtest_renderer.c<br>
@@ -153,6 +153,34 @@ void vtest_destroy_renderer(void)<br>
   renderer.out_fd = -1;<br>
 }<br>
<br>
+int vtest_send_caps2(void)<br>
+{<br>
+  uint32_t hdr_buf[2];<br>
+  void *caps_buf;<br>
+  int ret;<br>
+  uint32_t max_ver, max_size;<br>
+<br>
+  virgl_renderer_get_cap_set(2, &max_ver, &max_size);<br>
+<br>
+  caps_buf = malloc(max_size);<br>
+  if (!caps_buf)<br>
+    return -1;<br>
+<br>
+  virgl_renderer_fill_caps(2, 1, caps_buf);<br>
+<br>
+  hdr_buf[0] = max_size + 1;<br>
+  hdr_buf[1] = 2;<br>
+  ret = vtest_block_write(renderer.<wbr>out_fd, hdr_buf, 8);<br>
+  if (ret < 0)<br>
+    goto end;<br>
+  vtest_block_write(renderer.<wbr>out_fd, caps_buf, max_size);<br>
+  if (ret < 0)<br>
+      goto end;<br>
+ end:<br>
+    free(caps_buf);<br>
+    return 0;<br>
+}<br>
+<br>
 int vtest_send_caps(void)<br>
 {<br>
     uint32_t  max_ver, max_size;<br>
diff --git a/vtest/vtest_server.c b/vtest/vtest_server.c<br>
index 918639b..3868fe3 100644<br>
--- a/vtest/vtest_server.c<br>
+++ b/vtest/vtest_server.c<br>
@@ -129,6 +129,9 @@ again:<br>
         vtest_renderer_create_fence();<br>
        ret = vtest_resource_busy_wait();<br>
        break;<br>
+      case VCMD_GET_CAPS2:<br>
+       ret = vtest_send_caps2();<br>
+       break;<br>
       default:<br>
        break;<br>
       }<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.14.3<br>
<br>
______________________________<wbr>_________________<br>
virglrenderer-devel mailing list<br>
<a href="mailto:virglrenderer-devel@lists.freedesktop.org">virglrenderer-devel@lists.<wbr>freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/<wbr>virglrenderer-devel</a><br>
</font></span></blockquote></div><br></div>