Skip to content

Commit ca13030

Browse files
authored
Merge pull request #510 from orbisai0security/fix-v002-array-underflow
array: validate skip/count before array copy sizing
2 parents 7917f79 + ee11526 commit ca13030

1 file changed

Lines changed: 11 additions & 5 deletions

File tree

src/gl/array.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
#include "light.h"
77
#include "state.h"
88

9+
static int valid_copy_range(GLsizei skip, GLsizei count) {
10+
return count > 0 && skip >= 0 && skip < count;
11+
}
12+
913
GLvoid *copy_gl_array(const GLvoid *src,
1014
GLenum from, GLsizei width, GLsizei stride,
1115
GLenum to, GLsizei to_width, GLsizei skip, GLsizei count, void* dst) {
12-
if (! src || !count)
16+
if (!src || !valid_copy_range(skip, count))
1317
return NULL;
1418

1519
if (! stride)
@@ -79,7 +83,7 @@ GLvoid *copy_gl_array(const GLvoid *src,
7983
GLvoid *copy_gl_array_texcoord(const GLvoid *src,
8084
GLenum from, GLsizei width, GLsizei stride,
8185
GLsizei to_width, GLsizei skip, GLsizei count, void* dst) {
82-
if (! src || !count)
86+
if (!src || !valid_copy_range(skip, count))
8387
return NULL;
8488

8589
if (! stride)
@@ -137,7 +141,9 @@ GLvoid *copy_gl_array_texcoord(const GLvoid *src,
137141
GLvoid *copy_gl_array_quickconvert(const GLvoid *src,
138142
GLenum from, GLsizei stride,
139143
GLsizei skip, GLsizei count, void* dest) {
140-
144+
if (!src || !valid_copy_range(skip, count))
145+
return NULL;
146+
141147
if (! stride)
142148
stride = 4 * gl_sizeof(from);
143149
const char *unknown_str = "LIBGL: copy_gl_array_quickconvert -> unknown type: %x\n";
@@ -168,7 +174,7 @@ GLvoid *copy_gl_array_quickconvert(const GLvoid *src,
168174
GLvoid *copy_gl_array_convert(const GLvoid *src,
169175
GLenum from, GLsizei width, GLsizei stride,
170176
GLenum to, GLsizei to_width, GLsizei skip, GLsizei count, GLvoid* filler, void* dst) {
171-
if (! src || !count)
177+
if (!src || !valid_copy_range(skip, count))
172178
return NULL;
173179

174180
if (! stride)
@@ -460,7 +466,7 @@ void *copy_gl_array_bgra(void* dest, const void *ptr, GLint stride, GLsizei widt
460466
// this one only convert from BGRA (unsigned byte) to RGBA FLOAT
461467
GLubyte* src = (GLubyte*)ptr;
462468

463-
if (! src || !(count-skip))
469+
if (!src || !valid_copy_range(skip, count))
464470
return NULL;
465471

466472
if (! stride)

0 commit comments

Comments
 (0)