<div dir="ltr">Reviewed-by: Laura Ekstrand <<a href="mailto:laura@jlekstrand.net">laura@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 5, 2015 at 12:20 AM, Eduardo Lima Mitev <span dir="ltr"><<a href="mailto:elima@igalia.com" target="_blank">elima@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">_mesa_validate_pbo_access() provides a generic way to check that a<br>
requested pixel transfer operation on a PBO falls within the<br>
boundaries of the buffer. It is used in various other places, and<br>
depending on the caller, some arguments are used or not.<br>
<br>
In particular, the 'clientMemSize' argument is used only by calls<br>
that are knowledgeable of the total size of the user data involved<br>
in a pixel transfer, such as the case of compressed texture image<br>
calls. Other calls don't provide 'clientMemSize' directly since it<br>
is made implicit from the size and format of the texture, and its<br>
data type. In these cases, a sufficiently big value is passed to<br>
'clientMemSize' (INT_MAX) to avoid an incorrect constrain.<br>
<br>
The problem is that _mesa_validate_pbo_access() use uint<br>
pointers to make the calculations, which are 64 bits long in 64<br>
bits platforms, meanwhile the dummy INT_MAX passed in 'clientMemSize'<br>
is just 32 bits. This causes a constrain that is not desired.<br>
<br>
This patch fixes that by checking that if 'clientMemSize' is MAX_INT,<br>
then UINTPTR_MAX is assumed instead.<br>
<br>
This is an ugly workaround to the fact that _mesa_validate_pbo_access()<br>
intends to be a one function fits all. The clean solution here would<br>
be to break it into different functions that provide the adequate API<br>
for each of the possible code paths and validation needs.<br>
<br>
Since there are callers relying on passing INT_MAX to 'clientMemSize',<br>
this patch is necessary to deal with the problem above while a cleaner<br>
implementation of the PBO API is not implemented.<br>
---<br>
 src/mesa/main/pbo.c | 2 +-<br>
 1 file changed, 1 insertion(+), 1 deletion(-)<br>
<br>
diff --git a/src/mesa/main/pbo.c b/src/mesa/main/pbo.c<br>
index 5c906ed..259f763 100644<br>
--- a/src/mesa/main/pbo.c<br>
+++ b/src/mesa/main/pbo.c<br>
@@ -80,7 +80,7 @@ _mesa_validate_pbo_access(GLuint dimensions,<br>
     */<br>
    if (!_mesa_is_bufferobj(pack->BufferObj)) {<br>
       offset = 0;<br>
-      size = clientMemSize;<br>
+      size = (clientMemSize == INT_MAX) ? UINTPTR_MAX : clientMemSize;<br>
    } else {<br>
       offset = (uintptr_t)ptr;<br>
       size = pack->BufferObj->Size;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.1.3<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>