<div dir="ltr">Forgot to mention. This patch addresses bug #<a href="https://bugs.freedesktop.org/show_bug.cgi?id=74988">74988</a>.<div><br></div><div>No piglit regressions.</div><div><br></div><div>Courtney<br><div class="gmail_extra">
<br><br><div class="gmail_quote">On Fri, Feb 14, 2014 at 8:52 AM, Courtney Goeltzenleuchter <span dir="ltr"><<a href="mailto:courtney@lunarg.com" target="_blank">courtney@lunarg.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Decompressing ETC2 textures was causing intermitent segfault<br>
by copying resulting 4x4 texel block to the destination texture<br>
regardless of the size of the destination texture. Issue found<br>
via application crash in GLBenchmark 3.0's Manhattan test.<br>
<br>
Signed-off-by: Courtney Goeltzenleuchter <courtney@LunarG.com><br>
---<br>
 src/mesa/main/texcompress_etc.c | 49 +++++++++++++++++++++--------------------<br>
 1 file changed, 25 insertions(+), 24 deletions(-)<br>
<br>
diff --git a/src/mesa/main/texcompress_etc.c b/src/mesa/main/texcompress_etc.c<br>
index e3862be..f9234b0 100644<br>
--- a/src/mesa/main/texcompress_etc.c<br>
+++ b/src/mesa/main/texcompress_etc.c<br>
@@ -684,9 +684,10 @@ etc2_unpack_rgb8(uint8_t *dst_row,<br>
          etc2_rgb8_parse_block(&block, src,<br>
                                false /* punchthrough_alpha */);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         /* be sure to stay within the bounds of the texture */<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_rgb8_fetch_texel(&block, i, j, dst,<br>
                                      false /* punchthrough_alpha */);<br>
                dst[3] = 255;<br>
@@ -721,9 +722,9 @@ etc2_unpack_srgb8(uint8_t *dst_row,<br>
          etc2_rgb8_parse_block(&block, src,<br>
                                false /* punchthrough_alpha */);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_rgb8_fetch_texel(&block, i, j, dst,<br>
                                      false /* punchthrough_alpha */);<br>
                /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */<br>
@@ -764,9 +765,9 @@ etc2_unpack_rgba8(uint8_t *dst_row,<br>
       for (x = 0; x < width; x+= bw) {<br>
          etc2_rgba8_parse_block(&block, src);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_rgba8_fetch_texel(&block, i, j, dst);<br>
                dst += comps;<br>
             }<br>
@@ -801,9 +802,9 @@ etc2_unpack_srgb8_alpha8(uint8_t *dst_row,<br>
       for (x = 0; x < width; x+= bw) {<br>
          etc2_rgba8_parse_block(&block, src);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_rgba8_fetch_texel(&block, i, j, dst);<br>
<br>
                /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */<br>
@@ -843,9 +844,9 @@ etc2_unpack_r11(uint8_t *dst_row,<br>
       for (x = 0; x < width; x+= bw) {<br>
          etc2_r11_parse_block(&block, src);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps * comp_size;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_r11_fetch_texel(&block, i, j, dst);<br>
                dst += comps * comp_size;<br>
             }<br>
@@ -879,10 +880,10 @@ etc2_unpack_rg11(uint8_t *dst_row,<br>
          /* red component */<br>
          etc2_r11_parse_block(&block, src);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride +<br>
                            x * comps * comp_size;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_r11_fetch_texel(&block, i, j, dst);<br>
                dst += comps * comp_size;<br>
             }<br>
@@ -890,10 +891,10 @@ etc2_unpack_rg11(uint8_t *dst_row,<br>
          /* green component */<br>
          etc2_r11_parse_block(&block, src + 8);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride +<br>
                            x * comps * comp_size;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_r11_fetch_texel(&block, i, j, dst + comp_size);<br>
                dst += comps * comp_size;<br>
             }<br>
@@ -926,10 +927,10 @@ etc2_unpack_signed_r11(uint8_t *dst_row,<br>
       for (x = 0; x < width; x+= bw) {<br>
          etc2_r11_parse_block(&block, src);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride +<br>
                            x * comps * comp_size;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_signed_r11_fetch_texel(&block, i, j, dst);<br>
                dst += comps * comp_size;<br>
             }<br>
@@ -963,10 +964,10 @@ etc2_unpack_signed_rg11(uint8_t *dst_row,<br>
          /* red component */<br>
          etc2_r11_parse_block(&block, src);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride +<br>
                           x * comps * comp_size;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_signed_r11_fetch_texel(&block, i, j, dst);<br>
                dst += comps * comp_size;<br>
             }<br>
@@ -974,10 +975,10 @@ etc2_unpack_signed_rg11(uint8_t *dst_row,<br>
          /* green component */<br>
          etc2_r11_parse_block(&block, src + 8);<br>
<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride +<br>
                            x * comps * comp_size;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_signed_r11_fetch_texel(&block, i, j, dst + comp_size);<br>
                dst += comps * comp_size;<br>
             }<br>
@@ -1007,9 +1008,9 @@ etc2_unpack_rgb8_punchthrough_alpha1(uint8_t *dst_row,<br>
       for (x = 0; x < width; x+= bw) {<br>
          etc2_rgb8_parse_block(&block, src,<br>
                                true /* punchthrough_alpha */);<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_rgb8_fetch_texel(&block, i, j, dst,<br>
                                      true /* punchthrough_alpha */);<br>
                dst += comps;<br>
@@ -1042,9 +1043,9 @@ etc2_unpack_srgb8_punchthrough_alpha1(uint8_t *dst_row,<br>
       for (x = 0; x < width; x+= bw) {<br>
          etc2_rgb8_parse_block(&block, src,<br>
                                true /* punchthrough_alpha */);<br>
-         for (j = 0; j < bh; j++) {<br>
+         for (j = 0; j < bh && (j+y) < height; j++) {<br>
             uint8_t *dst = dst_row + (y + j) * dst_stride + x * comps;<br>
-            for (i = 0; i < bw; i++) {<br>
+            for (i = 0; i < bw && (i+x) < width; i++) {<br>
                etc2_rgb8_fetch_texel(&block, i, j, dst,<br>
                                      true /* punchthrough_alpha */);<br>
                /* Convert to MESA_FORMAT_B8G8R8A8_SRGB */<br>
<span><font color="#888888">--<br>
1.8.3.2<br>
<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Courtney Goeltzenleuchter<br><div>LunarG</div><div><img src="http://media.lunarg.com/wp-content/themes/LunarG/images/logo.png" width="96" height="65"><br>


</div></div>
</div></div></div>