diff options
| author | otto <> | 2017-01-24 15:54:53 +0000 |
|---|---|---|
| committer | otto <> | 2017-01-24 15:54:53 +0000 |
| commit | 5816ab689898865e87a865d92297fd40edd97eca (patch) | |
| tree | d5c9c15dfa2e53a73698f352aa608ced02956b8a /src | |
| parent | fe5134794a01afb621ceaefd31b817f891ddce2b (diff) | |
| download | openbsd-5816ab689898865e87a865d92297fd40edd97eca.tar.gz openbsd-5816ab689898865e87a865d92297fd40edd97eca.tar.bz2 openbsd-5816ab689898865e87a865d92297fd40edd97eca.zip | |
make sure realloc preserves data
Diffstat (limited to 'src')
| -rw-r--r-- | src/regress/lib/libc/malloc/malloc_general/malloc_general.c | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/src/regress/lib/libc/malloc/malloc_general/malloc_general.c b/src/regress/lib/libc/malloc/malloc_general/malloc_general.c index 336326bc57..3458b64c2a 100644 --- a/src/regress/lib/libc/malloc/malloc_general/malloc_general.c +++ b/src/regress/lib/libc/malloc/malloc_general/malloc_general.c | |||
| @@ -23,16 +23,36 @@ | |||
| 23 | 23 | ||
| 24 | #define N 1000 | 24 | #define N 1000 |
| 25 | 25 | ||
| 26 | size_t size(void) | 26 | size_t |
| 27 | size(void) | ||
| 27 | { | 28 | { |
| 28 | int p = arc4random_uniform(13) + 3; | 29 | int p = arc4random_uniform(13) + 3; |
| 29 | return arc4random_uniform(1 << p); | 30 | return arc4random_uniform(1 << p); |
| 30 | } | 31 | } |
| 31 | 32 | ||
| 32 | void *a[N]; | 33 | struct { void *p; size_t sz; } a[N]; |
| 33 | 34 | ||
| 34 | extern char *malloc_options; | 35 | extern char *malloc_options; |
| 35 | 36 | ||
| 37 | void | ||
| 38 | fill(u_char *p, size_t sz) | ||
| 39 | { | ||
| 40 | size_t i; | ||
| 41 | |||
| 42 | for (i = 0; i < sz; i++) | ||
| 43 | p[i] = i % 256; | ||
| 44 | } | ||
| 45 | |||
| 46 | void | ||
| 47 | check(u_char *p, size_t sz) | ||
| 48 | { | ||
| 49 | size_t i; | ||
| 50 | |||
| 51 | for (i = 0; i < sz; i++) | ||
| 52 | if (p[i] != i % 256) | ||
| 53 | errx(1, "check"); | ||
| 54 | } | ||
| 55 | |||
| 36 | int | 56 | int |
| 37 | main(int argc, char *argv[]) | 57 | main(int argc, char *argv[]) |
| 38 | { | 58 | { |
| @@ -54,43 +74,51 @@ main(int argc, char *argv[]) | |||
| 54 | i = arc4random_uniform(N); | 74 | i = arc4random_uniform(N); |
| 55 | switch (p) { | 75 | switch (p) { |
| 56 | case 0: | 76 | case 0: |
| 57 | if (a[i]) { | 77 | if (a[i].p) { |
| 58 | #ifdef VERBOSE | 78 | #ifdef VERBOSE |
| 59 | printf("F %p\n", a[i]); | 79 | printf("F %p\n", a[i].p); |
| 60 | #endif | 80 | #endif |
| 61 | free(a[i]); | 81 | if (a[i].p) |
| 62 | a[i] = NULL; | 82 | check(a[i].p, a[i].sz); |
| 83 | free(a[i].p); | ||
| 84 | a[i].p = NULL; | ||
| 63 | } | 85 | } |
| 64 | sz = size(); | 86 | sz = size(); |
| 65 | #ifdef VERBOSE | 87 | #ifdef VERBOSE |
| 66 | printf("M %zu=", sz); | 88 | printf("M %zu=", sz); |
| 67 | #endif | 89 | #endif |
| 68 | a[i] = malloc(sz); | 90 | a[i].p = malloc(sz); |
| 91 | a[i].sz = sz; | ||
| 69 | #ifdef VERBOSE | 92 | #ifdef VERBOSE |
| 70 | printf("%p\n", a[i]); | 93 | printf("%p\n", a[i].p); |
| 71 | #endif | 94 | #endif |
| 72 | if (a[i]) | 95 | if (a[i].p) |
| 73 | memset(a[i], 0xff, sz); | 96 | fill(a[i].p, sz); |
| 74 | break; | 97 | break; |
| 75 | case 1: | 98 | case 1: |
| 76 | sz = size(); | 99 | sz = size(); |
| 77 | #ifdef VERBOSE | 100 | #ifdef VERBOSE |
| 78 | printf("R %p %zu=", a[i], sz); | 101 | printf("R %p %zu=", a[i].p, sz); |
| 79 | #endif | 102 | #endif |
| 80 | q = realloc(a[i], sz); | 103 | q = realloc(a[i].p, sz); |
| 81 | #ifdef VERBOSE | 104 | #ifdef VERBOSE |
| 82 | printf("%p\n", q); | 105 | printf("%p\n", q); |
| 83 | #endif | 106 | #endif |
| 107 | if (a[i].p && q) | ||
| 108 | check(q, a[i].sz < sz ? a[i].sz : sz); | ||
| 84 | if (q) { | 109 | if (q) { |
| 85 | a[i]= q; | 110 | a[i].p = q; |
| 86 | if (a[i]) | 111 | a[i].sz = sz; |
| 87 | memset(a[i], 0xff, sz); | 112 | fill(a[i].p, sz); |
| 88 | } | 113 | } |
| 89 | break; | 114 | break; |
| 90 | } | 115 | } |
| 91 | } | 116 | } |
| 92 | for (i = 0; i < N; i++) | 117 | for (i = 0; i < N; i++) { |
| 93 | free(a[i]); | 118 | if (a[i].p) |
| 119 | check(a[i].p, a[i].sz); | ||
| 120 | free(a[i].p); | ||
| 121 | } | ||
| 94 | printf("\n"); | 122 | printf("\n"); |
| 95 | return 0; | 123 | return 0; |
| 96 | } | 124 | } |
