summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorotto <>2017-01-24 15:54:53 +0000
committerotto <>2017-01-24 15:54:53 +0000
commit37a34f32167b799e3c1fd47ef61c2f1dde0131b6 (patch)
treed5c9c15dfa2e53a73698f352aa608ced02956b8a /src
parent0d6e814ee27f88dfeac73ddff8b3a0aed7fdfd9b (diff)
downloadopenbsd-37a34f32167b799e3c1fd47ef61c2f1dde0131b6.tar.gz
openbsd-37a34f32167b799e3c1fd47ef61c2f1dde0131b6.tar.bz2
openbsd-37a34f32167b799e3c1fd47ef61c2f1dde0131b6.zip
make sure realloc preserves data
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libc/malloc/malloc_general/malloc_general.c62
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
26size_t size(void) 26size_t
27size(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
32void *a[N]; 33struct { void *p; size_t sz; } a[N];
33 34
34extern char *malloc_options; 35extern char *malloc_options;
35 36
37void
38fill(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
46void
47check(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
36int 56int
37main(int argc, char *argv[]) 57main(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}