diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/regress/lib/libc/qsort/qsort_test.c | 12 | 
1 files changed, 12 insertions, 0 deletions
| diff --git a/src/regress/lib/libc/qsort/qsort_test.c b/src/regress/lib/libc/qsort/qsort_test.c index f78137504a..b23f3e6190 100644 --- a/src/regress/lib/libc/qsort/qsort_test.c +++ b/src/regress/lib/libc/qsort/qsort_test.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | /* | 24 | /* | 
| 25 | * Test program based on Bentley & McIlroy's "Engineering a Sort Function". | 25 | * Test program based on Bentley & McIlroy's "Engineering a Sort Function". | 
| 26 | * Uses heapsort(3) to check the results. | 26 | * Uses heapsort(3) to check the results. | 
| 27 | * The "killer" input is from: | ||
| 28 | * http://calmerthanyouare.org/2014/06/11/algorithmic-complexity-attacks-and-libc-qsort.html | ||
| 27 | */ | 29 | */ | 
| 28 | 30 | ||
| 29 | enum distribution { | 31 | enum distribution { | 
| @@ -32,6 +34,7 @@ enum distribution { | |||
| 32 | STAGGER, | 34 | STAGGER, | 
| 33 | PLATEAU, | 35 | PLATEAU, | 
| 34 | SHUFFLE, | 36 | SHUFFLE, | 
| 37 | KILLER, | ||
| 35 | INVALID | 38 | INVALID | 
| 36 | }; | 39 | }; | 
| 37 | 40 | ||
| @@ -106,6 +109,15 @@ fill_test_array(int *x, int n, int dist, int m) | |||
| 106 | case SHUFFLE: | 109 | case SHUFFLE: | 
| 107 | x[i] = arc4random_uniform(m) ? (j += 2) : (k += 2); | 110 | x[i] = arc4random_uniform(m) ? (j += 2) : (k += 2); | 
| 108 | break; | 111 | break; | 
| 112 | case KILLER: | ||
| 113 | k = n / 2; | ||
| 114 | if (i < k) | ||
| 115 | x[i] = k - i; | ||
| 116 | else if (i > k) | ||
| 117 | x[i] = n + k + 1 - i; | ||
| 118 | else | ||
| 119 | x[i] = k + 1; | ||
| 120 | break; | ||
| 109 | default: | 121 | default: | 
| 110 | err(1, "unexpected distribution %d", dist); | 122 | err(1, "unexpected distribution %d", dist); | 
| 111 | } | 123 | } | 
