diff options
-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 | } |