Imported Debian patch 2:1.15.1-0ubuntu2.6
[deb_xorg-server.git] / debian / patches / CVE-2014-8xxx / 0026-glx-Integer-overflow-protection-for-non-generated-re.patch
CommitLineData
7217e0ca
ML
1From 84caa119e859d66e1a8368f265c16769e44e3291 Mon Sep 17 00:00:00 2001
2From: Adam Jackson <ajax@redhat.com>
3Date: Mon, 10 Nov 2014 12:13:42 -0500
4Subject: [PATCH 26/33] glx: Integer overflow protection for non-generated
5 render requests (v3) [CVE-2014-8093 5/6]
6
7v2:
8Fix constants in __glXMap2fReqSize (Michal Srb)
9Validate w/h/d for proxy targets too (Keith Packard)
10
11v3:
12Fix Map[12]Size to correctly reject order == 0 (Julien Cristau)
13
14Reviewed-by: Keith Packard <keithp@keithp.com>
15Reviewed-by: Michal Srb <msrb@suse.com>
16Reviewed-by: Andy Ritger <aritger@nvidia.com>
17Signed-off-by: Adam Jackson <ajax@redhat.com>
18Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
19---
20 glx/rensize.c | 77 ++++++++++++++++++++++++++++++---------------------------
21 1 file changed, 41 insertions(+), 36 deletions(-)
22
23diff --git a/glx/rensize.c b/glx/rensize.c
24index 9ff73c7..d46334a 100644
25--- a/glx/rensize.c
26+++ b/glx/rensize.c
27@@ -43,19 +43,11 @@
28 (((a & 0xff000000U)>>24) | ((a & 0xff0000U)>>8) | \
29 ((a & 0xff00U)<<8) | ((a & 0xffU)<<24))
30
31-static int
32-Map1Size(GLint k, GLint order)
33-{
34- if (order <= 0 || k < 0)
35- return -1;
36- return k * order;
37-}
38-
39 int
40 __glXMap1dReqSize(const GLbyte * pc, Bool swap)
41 {
42 GLenum target;
43- GLint order, k;
44+ GLint order;
45
46 target = *(GLenum *) (pc + 16);
47 order = *(GLint *) (pc + 20);
48@@ -63,15 +55,16 @@ __glXMap1dReqSize(const GLbyte * pc, Bool swap)
49 target = SWAPL(target);
50 order = SWAPL(order);
51 }
52- k = __glMap1d_size(target);
53- return 8 * Map1Size(k, order);
54+ if (order < 1)
55+ return -1;
56+ return safe_mul(8, safe_mul(__glMap1d_size(target), order));
57 }
58
59 int
60 __glXMap1fReqSize(const GLbyte * pc, Bool swap)
61 {
62 GLenum target;
63- GLint order, k;
64+ GLint order;
65
66 target = *(GLenum *) (pc + 0);
67 order = *(GLint *) (pc + 12);
68@@ -79,23 +72,24 @@ __glXMap1fReqSize(const GLbyte * pc, Bool swap)
69 target = SWAPL(target);
70 order = SWAPL(order);
71 }
72- k = __glMap1f_size(target);
73- return 4 * Map1Size(k, order);
74+ if (order < 1)
75+ return -1;
76+ return safe_mul(4, safe_mul(__glMap1f_size(target), order));
77 }
78
79 static int
80 Map2Size(int k, int majorOrder, int minorOrder)
81 {
82- if (majorOrder <= 0 || minorOrder <= 0 || k < 0)
83+ if (majorOrder < 1 || minorOrder < 1)
84 return -1;
85- return k * majorOrder * minorOrder;
86+ return safe_mul(k, safe_mul(majorOrder, minorOrder));
87 }
88
89 int
90 __glXMap2dReqSize(const GLbyte * pc, Bool swap)
91 {
92 GLenum target;
93- GLint uorder, vorder, k;
94+ GLint uorder, vorder;
95
96 target = *(GLenum *) (pc + 32);
97 uorder = *(GLint *) (pc + 36);
98@@ -105,15 +99,14 @@ __glXMap2dReqSize(const GLbyte * pc, Bool swap)
99 uorder = SWAPL(uorder);
100 vorder = SWAPL(vorder);
101 }
102- k = __glMap2d_size(target);
103- return 8 * Map2Size(k, uorder, vorder);
104+ return safe_mul(8, Map2Size(__glMap2d_size(target), uorder, vorder));
105 }
106
107 int
108 __glXMap2fReqSize(const GLbyte * pc, Bool swap)
109 {
110 GLenum target;
111- GLint uorder, vorder, k;
112+ GLint uorder, vorder;
113
114 target = *(GLenum *) (pc + 0);
115 uorder = *(GLint *) (pc + 12);
116@@ -123,8 +116,7 @@ __glXMap2fReqSize(const GLbyte * pc, Bool swap)
117 uorder = SWAPL(uorder);
118 vorder = SWAPL(vorder);
119 }
120- k = __glMap2f_size(target);
121- return 4 * Map2Size(k, uorder, vorder);
122+ return safe_mul(4, Map2Size(__glMap2f_size(target), uorder, vorder));
123 }
124
125 /**
126@@ -175,14 +167,16 @@ __glXImageSize(GLenum format, GLenum type, GLenum target,
127 GLint bytesPerElement, elementsPerGroup, groupsPerRow;
128 GLint groupSize, rowSize, padding, imageSize;
129
130+ if (w == 0 || h == 0 || d == 0)
131+ return 0;
132+
133 if (w < 0 || h < 0 || d < 0 ||
134 (type == GL_BITMAP &&
135 (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX))) {
136 return -1;
137 }
138- if (w == 0 || h == 0 || d == 0)
139- return 0;
140
141+ /* proxy targets have no data */
142 switch (target) {
143 case GL_PROXY_TEXTURE_1D:
144 case GL_PROXY_TEXTURE_2D:
145@@ -199,6 +193,12 @@ __glXImageSize(GLenum format, GLenum type, GLenum target,
146 return 0;
147 }
148
149+ /* real data has to have real sizes */
150+ if (imageHeight < 0 || rowLength < 0 || skipImages < 0 || skipRows < 0)
151+ return -1;
152+ if (alignment != 1 && alignment != 2 && alignment != 4 && alignment != 8)
153+ return -1;
154+
155 if (type == GL_BITMAP) {
156 if (rowLength > 0) {
157 groupsPerRow = rowLength;
158@@ -207,11 +207,14 @@ __glXImageSize(GLenum format, GLenum type, GLenum target,
159 groupsPerRow = w;
160 }
161 rowSize = bits_to_bytes(groupsPerRow);
162+ if (rowSize < 0)
163+ return -1;
164 padding = (rowSize % alignment);
165 if (padding) {
166 rowSize += alignment - padding;
167 }
168- return ((h + skipRows) * rowSize);
169+
170+ return safe_mul(safe_add(h, skipRows), rowSize);
171 }
172 else {
173 switch (format) {
174@@ -303,6 +306,7 @@ __glXImageSize(GLenum format, GLenum type, GLenum target,
175 default:
176 return -1;
177 }
178+ /* known safe by the switches above, not checked */
179 groupSize = bytesPerElement * elementsPerGroup;
180 if (rowLength > 0) {
181 groupsPerRow = rowLength;
182@@ -310,18 +314,21 @@ __glXImageSize(GLenum format, GLenum type, GLenum target,
183 else {
184 groupsPerRow = w;
185 }
186- rowSize = groupsPerRow * groupSize;
187+
188+ if ((rowSize = safe_mul(groupsPerRow, groupSize)) < 0)
189+ return -1;
190 padding = (rowSize % alignment);
191 if (padding) {
192 rowSize += alignment - padding;
193 }
194- if (imageHeight > 0) {
195- imageSize = (imageHeight + skipRows) * rowSize;
196- }
197- else {
198- imageSize = (h + skipRows) * rowSize;
199- }
200- return ((d + skipImages) * imageSize);
201+
202+ if (imageHeight > 0)
203+ h = imageHeight;
204+ h = safe_add(h, skipRows);
205+
206+ imageSize = safe_mul(h, rowSize);
207+
208+ return safe_mul(safe_add(d, skipImages), imageSize);
209 }
210 }
211
212@@ -445,9 +452,7 @@ __glXSeparableFilter2DReqSize(const GLbyte * pc, Bool swap)
213 /* XXX Should rowLength be used for either or both image? */
214 image1size = __glXImageSize(format, type, 0, w, 1, 1,
215 0, rowLength, 0, 0, alignment);
216- image1size = __GLX_PAD(image1size);
217 image2size = __glXImageSize(format, type, 0, h, 1, 1,
218 0, rowLength, 0, 0, alignment);
219- return image1size + image2size;
220-
221+ return safe_add(safe_pad(image1size), image2size);
222 }
223--
2241.7.9.2
225