aboutsummaryrefslogtreecommitdiffstats
path: root/graphics/libwmf/files/patch-rh1227243-CVE-2015-4588
blob: 10b6bef2d29d41bae519338507896acb6bb6ff96 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
diff -ru src/ipa/ipa/bmp.h src/ipa/ipa/bmp.h
--- src/ipa/ipa/bmp.h   2015-06-03 09:30:59.410501271 +0100
+++ src/ipa/ipa/bmp.h   2015-06-03 09:31:05.775572630 +0100
@@ -859,7 +859,7 @@
 %
 %
 */
-static void DecodeImage (wmfAPI* API,wmfBMP* bmp,BMPSource* src,unsigned int compression,unsigned char* pixels)
+static int DecodeImage (wmfAPI* API,wmfBMP* bmp,BMPSource* src,unsigned int compression,unsigned char* pixels)
 {  int byte;
    int count;
    int i;
@@ -870,12 +870,14 @@
    U32 u;
 
    unsigned char* q;
+   unsigned char* end;
 
    for (u = 0; u < ((U32) bmp->width * (U32) bmp->height); u++) pixels[u] = 0;
 
    byte = 0;
    x = 0;
    q = pixels;
+   end = pixels + bmp->width * bmp->height;
 
    for (y = 0; y < bmp->height; )
    {   count = ReadBlobByte (src);
@@ -884,7 +886,10 @@
        {   /* Encoded mode. */
            byte = ReadBlobByte (src);
            for (i = 0; i < count; i++)
-           {   if (compression == 1)
+           {   
+               if (q == end)
+                   return 0;
+               if (compression == 1)
                {   (*(q++)) = (unsigned char) byte;
                }
                else
@@ -896,13 +901,15 @@
        else
        {   /* Escape mode. */
            count = ReadBlobByte (src);
-           if (count == 0x01) return;
+           if (count == 0x01) return 1;
            switch (count)
            {
            case 0x00:
             {  /* End of line. */
                x = 0;
                y++;
+               if (y >= bmp->height)
+                   return 0;
                q = pixels + y * bmp->width;
                break;
             }
@@ -910,13 +917,20 @@
             {  /* Delta mode. */
                x += ReadBlobByte (src);
                y += ReadBlobByte (src);
+               if (y >= bmp->height)
+                   return 0;
+               if (x >= bmp->width)
+                   return 0;
                q = pixels + y * bmp->width + x;
                break;
             }
            default:
             {  /* Absolute mode. */
                for (i = 0; i < count; i++)
-               {   if (compression == 1)
+               {
+                   if (q == end)
+                       return 0;
+                   if (compression == 1)
                    {   (*(q++)) = ReadBlobByte (src);
                    }
                    else
@@ -943,7 +957,7 @@
    byte = ReadBlobByte (src);  /* end of line */
    byte = ReadBlobByte (src);
 
-   return;
+   return 1;
 }
 
 /*
@@ -1146,7 +1160,10 @@
    {
        if (bmp_info.bits_per_pixel == 8)   /* Convert run-length encoded raster pixels. */
        {
-           DecodeImage (API,bmp,src,(unsigned int) bmp_info.compression,data->image);
+           if (!DecodeImage (API,bmp,src,(unsigned int) bmp_info.compression,data->image))
+           {   WMF_ERROR (API,"corrupt bmp");
+               API->err = wmf_E_BadFormat;
+           }
        }
        else
        {   WMF_ERROR (API,"Unexpected pixel depth");
diff -ru src/ipa/ipa.h src/ipa/ipa.h
--- src/ipa/ipa.h   2015-06-03 09:30:59.410501271 +0100
+++ src/ipa/ipa.h   2015-06-03 09:31:08.687605277 +0100
@@ -48,7 +48,7 @@
 static unsigned short ReadBlobLSBShort (BMPSource*);
 static unsigned long  ReadBlobLSBLong (BMPSource*);
 static long           TellBlob (BMPSource*);
-static void           DecodeImage (wmfAPI*,wmfBMP*,BMPSource*,unsigned int,unsigned char*);
+static int            DecodeImage (wmfAPI*,wmfBMP*,BMPSource*,unsigned int,unsigned char*);
 static void           ReadBMPImage (wmfAPI*,wmfBMP*,BMPSource*);
 static int            ExtractColor (wmfAPI*,wmfBMP*,wmfRGB*,unsigned int,unsigned int);
 static void           SetColor (wmfAPI*,wmfBMP*,wmfRGB*,unsigned char,unsigned int,unsigned int);