aboutsummaryrefslogtreecommitdiff
path: root/graphics/gd/files/patch-gd_tga.c
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/gd/files/patch-gd_tga.c')
-rw-r--r--graphics/gd/files/patch-gd_tga.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/graphics/gd/files/patch-gd_tga.c b/graphics/gd/files/patch-gd_tga.c
new file mode 100644
index 000000000000..aacc04de8f0a
--- /dev/null
+++ b/graphics/gd/files/patch-gd_tga.c
@@ -0,0 +1,88 @@
+--- src/gd_tga.c.orig 2016-07-18 19:23:11 UTC
++++ src/gd_tga.c
+@@ -99,7 +99,7 @@ BGD_DECLARE(gdImagePtr) gdImageCreateFro
+ if (tga->bits == TGA_BPP_24) {
+ *tpix = gdTrueColor(tga->bitmap[bitmap_caret + 2], tga->bitmap[bitmap_caret + 1], tga->bitmap[bitmap_caret]);
+ bitmap_caret += 3;
+- } else if (tga->bits == TGA_BPP_32 || tga->alphabits) {
++ } else if (tga->bits == TGA_BPP_32 && tga->alphabits) {
+ register int a = tga->bitmap[bitmap_caret + 3];
+
+ *tpix = gdTrueColorAlpha(tga->bitmap[bitmap_caret + 2], tga->bitmap[bitmap_caret + 1], tga->bitmap[bitmap_caret], gdAlphaMax - (a >> 1));
+@@ -159,16 +159,13 @@ int read_header_tga(gdIOCtx *ctx, oTga *
+ printf("wxh: %i %i\n", tga->width, tga->height);
+ #endif
+
+- switch(tga->bits) {
+- case 8:
+- case 16:
+- case 24:
+- case 32:
+- break;
+- default:
+- gd_error("bps %i not supported", tga->bits);
++ if (!((tga->bits == TGA_BPP_24 && tga->alphabits == 0)
++ || (tga->bits == TGA_BPP_32 && tga->alphabits == 8)))
++ {
++ gd_error_ex(GD_WARNING, "gd-tga: %u bits per pixel with %u alpha bits not supported\n",
++ tga->bits, tga->alphabits);
++
+ return -1;
+- break;
+ }
+
+ tga->ident = NULL;
+@@ -285,14 +285,23 @@ int read_image_tga( gdIOCtx *ctx, oTga *
+ buffer_caret = 0;
+
+ while( bitmap_caret < image_block_size ) {
+-
++
+ if ((decompression_buffer[buffer_caret] & TGA_RLE_FLAG) == TGA_RLE_FLAG) {
+ encoded_pixels = ( ( decompression_buffer[ buffer_caret ] & 127 ) + 1 );
+ buffer_caret++;
+
+- for (i = 0; i < encoded_pixels; i++) {
+- for (j = 0; j < pixel_block_size; j++, bitmap_caret++) {
+- tga->bitmap[ bitmap_caret ] = decompression_buffer[ buffer_caret + j ];
++ if (encoded_pixels != 0) {
++
++ if (!((buffer_caret + (encoded_pixels * pixel_block_size)) < image_block_size)) {
++ gdFree( decompression_buffer );
++ gdFree( conversion_buffer );
++ return -1;
++ }
++
++ for (i = 0; i < encoded_pixels; i++) {
++ for (j = 0; j < pixel_block_size; j++, bitmap_caret++) {
++ tga->bitmap[ bitmap_caret ] = decompression_buffer[ buffer_caret + j ];
++ }
+ }
+ }
+ buffer_caret += pixel_block_size;
+@@ -300,11 +309,20 @@ int read_image_tga( gdIOCtx *ctx, oTga *
+ encoded_pixels = decompression_buffer[ buffer_caret ] + 1;
+ buffer_caret++;
+
+- for (i = 0; i < encoded_pixels; i++) {
+- for( j = 0; j < pixel_block_size; j++, bitmap_caret++ ) {
+- tga->bitmap[ bitmap_caret ] = decompression_buffer[ buffer_caret + j ];
++ if (encoded_pixels != 0) {
++
++ if (!((buffer_caret + (encoded_pixels * pixel_block_size)) < image_block_size)) {
++ gdFree( decompression_buffer );
++ gdFree( conversion_buffer );
++ return -1;
++ }
++
++ for (i = 0; i < encoded_pixels; i++) {
++ for( j = 0; j < pixel_block_size; j++, bitmap_caret++ ) {
++ tga->bitmap[ bitmap_caret ] = decompression_buffer[ buffer_caret + j ];
++ }
++ buffer_caret += pixel_block_size;
+ }
+- buffer_caret += pixel_block_size;
+ }
+ }
+ }
+