Skip to content

Commit cad2dd8

Browse files
committed
Add bounds checks to SDL_qsort
1 parent 8a80f41 commit cad2dd8

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/stdlib/SDL_qsort.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ typedef struct { char * first; char * last; } stack_entry;
333333
char *test; \
334334
/* Find the right place for |first|. \
335335
* My apologies for var reuse. */ \
336-
for (test=first-size;compare(userdata,test,first)>0;test-=size) ; \
336+
for (test=first-size;test>(char*)base&&compare(userdata,test,first)>0;test-=size) ; \
337337
test+=size; \
338338
if (test!=first) { \
339339
/* Shift everything in [test,first) \
@@ -418,6 +418,7 @@ static void qsort_r_nonaligned(void *base, size_t nmemb, size_t size,
418418
while (1) {
419419
/* Select pivot */
420420
{ char * mid=first+size*((last-first)/size >> 1);
421+
if (mid>=last) break;
421422
Pivot(SWAP_nonaligned,size);
422423
memcpy(pivot,mid,size);
423424
}
@@ -449,6 +450,7 @@ static void qsort_r_aligned(void *base, size_t nmemb, size_t size,
449450
while (1) {
450451
/* Select pivot */
451452
{ char * mid=first+size*((last-first)/size >> 1);
453+
if (mid>=last) break;
452454
Pivot(SWAP_aligned,size);
453455
memcpy(pivot,mid,size);
454456
}
@@ -484,6 +486,7 @@ fprintf(stderr,"Doing %d:%d: ",
484486
#endif
485487
/* Select pivot */
486488
{ char * mid=first+WORD_BYTES*((last-first) / (2*WORD_BYTES));
489+
if (mid>=last) break;
487490
Pivot(SWAP_words,WORD_BYTES);
488491
*(int*)pivot=*(int*)mid;
489492
#ifdef DEBUG_QSORT
@@ -506,7 +509,7 @@ fprintf(stderr, "after partitioning first=#%lu last=#%lu\n", (first-(char*)base)
506509
/* Find the right place for |first|. My apologies for var reuse */
507510
int *pl=(int*)(first-WORD_BYTES),*pr=(int*)first;
508511
*(int*)pivot=*(int*)first;
509-
for (;compare(userdata,pl,pivot)>0;pr=pl,--pl) {
512+
for (;pl>(int*)base&&compare(userdata,pl,pivot)>0;pr=pl,--pl) {
510513
*pr=*pl; }
511514
if (pr!=(int*)first) *pr=*(int*)pivot;
512515
}

0 commit comments

Comments
 (0)