@@ -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 }
@@ -571,4 +574,3 @@ void *SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size,
571574 // qsort_non_r_bridge just happens to match calling conventions, so reuse it.
572575 return SDL_bsearch_r (key , base , nmemb , size , qsort_non_r_bridge , compare );
573576}
574-
0 commit comments