@@ -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