Browse code

mpool opt

git-svn: trunk@4354

aCaB authored on 2008/11/08 14:34:25
Showing 3 changed files
... ...
@@ -1,3 +1,8 @@
1
+Sat Nov  8 05:27:43 CET 2008 (acab)
2
+-----------------------------------
3
+ * libclamav/mpool.c: slightly optimized (we're now faster and more compact
4
+		      than malloc() - it's just because we cheat more :)
5
+
1 6
 Fri Nov  7 19:37:38 EET 2008 (edwin)
2 7
 ------------------------------------
3 8
  * clamd/, libclamav/, libclamunrar/, unit_tests/: fix more compiler
4 9
new file mode 100644
... ...
@@ -0,0 +1,17 @@
0
+#!/usr/bin/perl
1
+
2
+use strict;
3
+use warnings;
4
+
5
+my %frags = ();
6
+
7
+while (<>) {
8
+	chomp;
9
+	next unless /^LibClamAV Warning: [mc]alloc .* size (\d+) .*$/;
10
+	$frags{$1}++;
11
+}
12
+
13
+foreach (sort {$a<=>$b} (keys(%frags))) {
14
+	print "$_, /* ($frags{$_}) */\n";
15
+}
16
+
... ...
@@ -44,9 +44,8 @@
44 44
 #include <assert.h>
45 45
 
46 46
 #define MPOOLMAGIC 0x5adeada5
47
-/*#define DEBUGMPOOL /\* DO NOT define *\/ */
47
+/* #define DEBUGMPOOL /\* DO NOT define *\/ */
48 48
 #ifdef DEBUGMPOOL
49
-FILE *lfd = NULL;
50 49
 #define spam(...) cli_warnmsg( __VA_ARGS__)
51 50
 #else
52 51
 #define spam
... ...
@@ -68,85 +67,94 @@ FILE *lfd = NULL;
68 68
 
69 69
 #if SIZEOF_VOID_P==8
70 70
 static const unsigned int fragsz[] = {
71
-24, /* (33067) */
72
-32, /* (93970) */
73
-40, /* (731473) */
74
-48, /* (35342) */
75
-56, /* (6967) */
76
-64, /* (442053) */
77
-72, /* (2706) */
78
-80, /* (2281) */
79
-88, /* (3658) */
80
-96, /* (2620) */
81
-104, /* (3705) */
82
-112, /* (3722) */
83
-120, /* (4012) */
84
-128, /* (5161) */
85
-136, /* (22458) */
86
-144, /* (4339) */
87
-152, /* (4315) */
88
-160, /* (12195) */
89
-168, /* (18042) */
90
-/* 176, /\* (341) *\/ */
91
-/* 184, /\* (329) *\/ */
92
-192, /* (202) */
93
-/* 200, /\* (238) *\/ */
94
-/* 208, /\* (166) *\/ */
95
-/* 216, /\* (179) *\/ */
96
-224, /* (216) */
97
-/* 232, /\* (189) *\/ */
98
-/* 240, /\* (157) *\/ */
99
-/* 248, /\* (178) *\/ */
100
-256, /* (133) */
101
-/* 264, /\* (157) *\/ */
102
-/* 272, /\* (140) *\/ */
103
-/* 280, /\* (161) *\/ */
104
-/* 288, /\* (125) *\/ */
105
-/* 296, /\* (141) *\/ */
106
-304, /* (100) */
107
-/* 312, /\* (114) *\/ */
108
-/* 320, /\* (70) *\/ */
109
-/* 328, /\* (13) *\/ */
110
-/* 336, /\* (21) *\/ */
111
-/* 344, /\* (21) *\/ */
112
-352, /* (13) */
113
-/* 360, /\* (26) *\/ */
114
-/* 368, /\* (8) *\/ */
115
-/* 376, /\* (14) *\/ */
116
-/* 384, /\* (5) *\/ */
117
-/* 392, /\* (6) *\/ */
118
-/* 400, /\* (4) *\/ */
119
-/* 408, /\* (2) *\/ */
120
-/* 416, /\* (6) *\/ */
121
-424, /* (20) */
71
+16, /* (37189) */
72
+24, /* (94629) */
73
+32, /* (756188) */
74
+40, /* (35658) */
75
+48, /* (6989) */
76
+56, /* (454597) */
77
+64, /* (2736) */
78
+72, /* (2298) */
79
+80, /* (3664) */
80
+88, /* (2636) */
81
+96, /* (3715) */
82
+104, /* (3732) */
83
+112, /* (4021) */
84
+120, /* (5165) */
85
+128, /* (22788) */
86
+136, /* (4343) */
87
+144, /* (4321) */
88
+152, /* (12196) */
89
+160, /* (18044) */
90
+/* 168, /\* (344) *\/ */
91
+/* 176, /\* (335) *\/ */
92
+/* 184, /\* (204) *\/ */
93
+192, /* (226) */
94
+/* 200, /\* (185) *\/ */
95
+/* 208, /\* (181) *\/ */
96
+/* 216, /\* (217) *\/ */
97
+224, /* (172) */
98
+/* 232, /\* (175) *\/ */
99
+/* 240, /\* (178) *\/ */
100
+/* 248, /\* (135) *\/ */
101
+256, /* (140) */
102
+/* 264, /\* (158) *\/ */
103
+/* 272, /\* (161) *\/ */
104
+/* 280, /\* (126) *\/ */
105
+/* 288, /\* (141) *\/ */
106
+296, /* (101) */
107
+/* 304, /\* (97) *\/ */
108
+/* 312, /\* (85) *\/ */
109
+/* 320, /\* (14) *\/ */
110
+/* 328, /\* (21) *\/ */
111
+336, /* (21) */
112
+/* 344, /\* (12) *\/ */
113
+/* 352, /\* (10) *\/ */
114
+/* 360, /\* (7) *\/ */
115
+/* 368, /\* (14) *\/ */
116
+376, /* (21) */
117
+/* 384, /\* (6) *\/ */
118
+/* 392, /\* (4) *\/ */
119
+/* 400, /\* (3) *\/ */
120
+/* 408, /\* (6) *\/ */
121
+/* 416, /\* (5) *\/ */
122
+/* 424, /\* (5) *\/ */
122 123
 /* 432, /\* (4) *\/ */
123
-/* 440, /\* (4) *\/ */
124
-/* 448, /\* (4) *\/ */
125
-/* 464, /\* (2) *\/ */
126
-/* 472, /\* (2) *\/ */
127
-/* 480, /\* (1) *\/ */
128
-/* 496, /\* (1) *\/ */
129
-/* 512, /\* (2) *\/ */
130
-528, /* (15) */
131
-/* 536, /\* (1) *\/ */
132
-/* 544, /\* (2) *\/ */
133
-/* 552, /\* (1) *\/ */
134
-/* 584, /\* (3) *\/ */
135
-/* 600, /\* (1) *\/ */
136
-/* 624, /\* (1) *\/ */
124
+440, /* (19) */
125
+/* 456, /\* (2) *\/ */
126
+/* 464, /\* (8) *\/ */
127
+/* 472, /\* (3) *\/ */
128
+/* 488, /\* (1) *\/ */
129
+/* 496, /\* (4) *\/ */
130
+/* 504, /\* (3) *\/ */
131
+/* 512, /\* (1) *\/ */
132
+/* 520, /\* (2) *\/ */
133
+/* 528, /\* (6) *\/ */
134
+/* 536, /\* (3) *\/ */
135
+544, /* (16) */
136
+/* 560, /\* (4) *\/ */
137
+/* 576, /\* (3) *\/ */
138
+/* 592, /\* (8) *\/ */
139
+/* 616, /\* (2) *\/ */
140
+/* 624, /\* (5) *\/ */
141
+/* 648, /\* (1) *\/ */
137 142
 /* 656, /\* (1) *\/ */
138
-/* 784, /\* (2) *\/ */
139
-1040, /* (15) */
140
-/* 2064, /\* (7456) *\/ */
141
-2072, /* (14) */
142
-4112, /* (14) */
143
-8208, /* (9) */
144
-16400, /* (6) */
145
-32784, /* (4) */
146
-63512, /* (7) */
147
-134408, /* (2) */
148
-507984, /* (7) */
149
-1051040, /* (1) */
143
+/* 680, /\* (1) *\/ */
144
+/* 704, /\* (1) *\/ */
145
+/* 720, /\* (1) *\/ */
146
+/* 776, /\* (2) *\/ */
147
+1056, /* (15) */
148
+2056, /* (7585) */
149
+/* 2064, /\* (14) *\/ */
150
+2088, /* (14) */
151
+4128, /* (14) */
152
+8224, /* (9) */
153
+16416, /* (6) */
154
+32800, /* (4) */
155
+63504, /* (7) */
156
+136352, /* (1) */
157
+507976, /* (7) */
158
+1051032, /* (1) */
150 159
 2097152
151 160
 /* ^^ This shouldn't be reached but it's a good fall back
152 161
  * MAX_ALLOCATION is 184549376 but that's really not need here */
... ...
@@ -155,150 +163,149 @@ static const unsigned int fragsz[] = {
155 155
 #else
156 156
 
157 157
 static const unsigned int fragsz[] = {
158
-12, /* (2297) */
159
-16, /* (30785) */
160
-20, /* (41460) */
161
-24, /* (69214) */
162
-28, /* (639488) */
163
-32, /* (107920) */
164
-36, /* (454213) */
165
-40, /* (11497) */
166
-44, /* (1688) */
167
-48, /* (5294) */
168
-52, /* (1496) */
169
-56, /* (3738) */
170
-60, /* (1719) */
171
-64, /* (918) */
172
-68, /* (956) */
173
-72, /* (1324) */
174
-76, /* (1905) */
175
-80, /* (1745) */
176
-84, /* (1053) */
177
-88, /* (1566) */
178
-92, /* (2081) */
179
-96, /* (20851) */
180
-100, /* (1882) */
181
-104, /* (1848) */
182
-108, /* (1931) */
183
-112, /* (2079) */
184
-116, /* (1736) */
185
-120, /* (3425) */
186
-124, /* (2115) */
187
-128, /* (1298) */
188
-132, /* (2307) */
189
-136, /* (2033) */
190
-140, /* (2837) */
191
-144, /* (1479) */
192
-148, /* (1607) */
193
-152, /* (10587) */
194
-156, /* (2719) */
195
-160, /* (15311) */
196
-164, /* (196) */
197
-168, /* (145) */
198
-172, /* (211) */
199
-176, /* (140) */
200
-180, /* (116) */
201
-/* 184, /\* (86) *\/ */
202
-188, /* (119) */
203
-192, /* (104) */
204
-/* 196, /\* (99) *\/ */
205
-/* 200, /\* (84) *\/ */
206
-/* 204, /\* (94) *\/ */
207
-/* 208, /\* (86) *\/ */
208
-212, /* (136) */
209
-/* 216, /\* (80) *\/ */
210
-/* 220, /\* (75) *\/ */
211
-/* 224, /\* (97) *\/ */
212
-/* 228, /\* (99) *\/ */
213
-/* 232, /\* (74) *\/ */
214
-236, /* (114) */
215
-/* 240, /\* (64) *\/ */
216
-/* 244, /\* (73) *\/ */
217
-/* 248, /\* (62) *\/ */
218
-/* 252, /\* (71) *\/ */
219
-/* 256, /\* (69) *\/ */
220
-/* 260, /\* (85) *\/ */
221
-/* 264, /\* (71) *\/ */
222
-268, /* (92) */
223
-/* 272, /\* (69) *\/ */
224
-/* 276, /\* (56) *\/ */
225
-/* 280, /\* (69) *\/ */
226
-/* 284, /\* (71) *\/ */
227
-/* 288, /\* (70) *\/ */
228
-/* 292, /\* (62) *\/ */
229
-/* 296, /\* (39) *\/ */
230
-/* 300, /\* (54) *\/ */
231
-/* 304, /\* (43) *\/ */
232
-/* 308, /\* (54) *\/ */
233
-312, /* (30) */
234
-/* 316, /\* (8) *\/ */
235
-/* 320, /\* (5) *\/ */
236
-/* 324, /\* (7) *\/ */
237
-/* 328, /\* (14) *\/ */
238
-/* 332, /\* (13) *\/ */
239
-/* 336, /\* (8) *\/ */
240
-/* 340, /\* (7) *\/ */
241
-/* 344, /\* (6) *\/ */
242
-/* 348, /\* (2) *\/ */
243
-/* 352, /\* (7) *\/ */
244
-/* 356, /\* (18) *\/ */
245
-/* 360, /\* (5) *\/ */
246
-364, /* (12) */
247
-/* 368, /\* (2) *\/ */
248
-/* 372, /\* (4) *\/ */
249
-/* 376, /\* (2) *\/ */
250
-/* 380, /\* (5) *\/ */
251
-/* 384, /\* (1) *\/ */
252
-/* 392, /\* (4) *\/ */
253
-/* 396, /\* (3) *\/ */
254
-/* 404, /\* (4) *\/ */
255
-/* 408, /\* (2) *\/ */
256
-/* 412, /\* (3) *\/ */
257
-/* 416, /\* (2) *\/ */
258
-/* 420, /\* (3) *\/ */
259
-/* 424, /\* (2) *\/ */
260
-428, /* (16) */
261
-/* 432, /\* (4) *\/ */
262
-/* 436, /\* (1) *\/ */
263
-/* 440, /\* (3) *\/ */
264
-/* 452, /\* (1) *\/ */
265
-/* 456, /\* (2) *\/ */
266
-/* 460, /\* (8) *\/ */
267
-/* 468, /\* (1) *\/ */
268
-/* 472, /\* (2) *\/ */
269
-/* 484, /\* (1) *\/ */
270
-/* 492, /\* (4) *\/ */
271
-/* 500, /\* (1) *\/ */
272
-/* 504, /\* (2) *\/ */
273
-/* 508, /\* (1) *\/ */
274
-/* 516, /\* (2) *\/ */
275
-/* 524, /\* (5) *\/ */
276
-532, /* (15) */
277
-/* 536, /\* (3) *\/ */
278
-/* 540, /\* (1) *\/ */
279
-/* 556, /\* (4) *\/ */
280
-/* 576, /\* (3) *\/ */
281
-/* 588, /\* (8) *\/ */
158
+8, /* (6381) */
159
+12, /* (30903) */
160
+16, /* (41616) */
161
+20, /* (69507) */
162
+24, /* (646497) */
163
+28, /* (108677) */
164
+32, /* (458074) */
165
+36, /* (11537) */
166
+40, /* (1690) */
167
+44, /* (5326) */
168
+48, /* (1505) */
169
+52, /* (3777) */
170
+56, /* (1730) */
171
+60, /* (943) */
172
+64, /* (963) */
173
+68, /* (1345) */
174
+72, /* (1909) */
175
+76, /* (1765) */
176
+80, /* (1060) */
177
+84, /* (1586) */
178
+88, /* (2082) */
179
+92, /* (21009) */
180
+96, /* (1886) */
181
+100, /* (1869) */
182
+104, /* (1936) */
183
+108, /* (2097) */
184
+112, /* (1736) */
185
+116, /* (3442) */
186
+120, /* (2117) */
187
+124, /* (1317) */
188
+128, /* (2307) */
189
+132, /* (2051) */
190
+136, /* (2839) */
191
+140, /* (1497) */
192
+144, /* (1607) */
193
+148, /* (10604) */
194
+152, /* (2719) */
195
+156, /* (15328) */
196
+160, /* (197) */
197
+/* 164, /\* (161) *\/ */
198
+/* 168, /\* (195) *\/ */
199
+172, /* (156) */
200
+/* 176, /\* (132) *\/ */
201
+/* 180, /\* (86) *\/ */
202
+/* 184, /\* (120) *\/ */
203
+188, /* (122) */
204
+/* 192, /\* (84) *\/ */
205
+/* 196, /\* (84) *\/ */
206
+/* 200, /\* (95) *\/ */
207
+/* 204, /\* (86) *\/ */
208
+208, /* (137) */
209
+/* 212, /\* (95) *\/ */
210
+/* 216, /\* (75) *\/ */
211
+/* 220, /\* (97) *\/ */
212
+/* 224, /\* (84) *\/ */
213
+/* 228, /\* (74) *\/ */
214
+232, /* (114) */
215
+/* 236, /\* (79) *\/ */
216
+/* 240, /\* (73) *\/ */
217
+/* 244, /\* (62) *\/ */
218
+/* 248, /\* (71) *\/ */
219
+/* 252, /\* (69) *\/ */
220
+256, /* (70) */
221
+/* 260, /\* (86) *\/ */
222
+/* 264, /\* (92) *\/ */
223
+/* 268, /\* (69) *\/ */
224
+/* 272, /\* (56) *\/ */
225
+/* 276, /\* (70) *\/ */
226
+280, /* (71) */
227
+/* 284, /\* (70) *\/ */
228
+/* 288, /\* (62) *\/ */
229
+/* 292, /\* (54) *\/ */
230
+/* 296, /\* (54) *\/ */
231
+/* 300, /\* (43) *\/ */
232
+/* 304, /\* (39) *\/ */
233
+308, /* (30) */
234
+/* 312, /\* (9) *\/ */
235
+/* 316, /\* (5) *\/ */
236
+/* 320, /\* (7) *\/ */
237
+/* 324, /\* (14) *\/ */
238
+/* 328, /\* (13) *\/ */
239
+332, /* (23) */
240
+/* 336, /\* (6) *\/ */
241
+/* 340, /\* (6) *\/ */
242
+/* 344, /\* (3) *\/ */
243
+/* 348, /\* (7) *\/ */
244
+/* 352, /\* (3) *\/ */
245
+/* 356, /\* (4) *\/ */
246
+/* 360, /\* (12) *\/ */
247
+/* 364, /\* (2) *\/ */
248
+/* 368, /\* (3) *\/ */
249
+372, /* (17) */
250
+/* 376, /\* (5) *\/ */
251
+/* 380, /\* (1) *\/ */
252
+/* 388, /\* (4) *\/ */
253
+/* 392, /\* (3) *\/ */
254
+/* 400, /\* (4) *\/ */
255
+/* 404, /\* (2) *\/ */
256
+/* 408, /\* (3) *\/ */
257
+/* 412, /\* (2) *\/ */
258
+/* 416, /\* (3) *\/ */
259
+/* 420, /\* (2) *\/ */
260
+/* 428, /\* (4) *\/ */
261
+/* 432, /\* (1) *\/ */
262
+436, /* (18) */
263
+/* 452, /\* (2) *\/ */
264
+/* 456, /\* (8) *\/ */
265
+/* 464, /\* (1) *\/ */
266
+/* 468, /\* (2) *\/ */
267
+/* 480, /\* (1) *\/ */
268
+/* 488, /\* (4) *\/ */
269
+/* 496, /\* (1) *\/ */
270
+/* 500, /\* (2) *\/ */
271
+/* 504, /\* (1) *\/ */
272
+/* 512, /\* (2) *\/ */
273
+/* 520, /\* (6) *\/ */
274
+/* 532, /\* (3) *\/ */
275
+/* 536, /\* (1) *\/ */
276
+540, /* (15) */
277
+/* 552, /\* (4) *\/ */
278
+/* 572, /\* (3) *\/ */
279
+/* 584, /\* (7) *\/ */
280
+/* 588, /\* (1) *\/ */
281
+/* 608, /\* (1) *\/ */
282 282
 /* 612, /\* (1) *\/ */
283
-/* 616, /\* (1) *\/ */
284
-/* 620, /\* (5) *\/ */
283
+/* 616, /\* (5) *\/ */
284
+/* 644, /\* (1) *\/ */
285 285
 /* 648, /\* (1) *\/ */
286
-/* 652, /\* (1) *\/ */
287
-/* 680, /\* (1) *\/ */
288
-/* 704, /\* (1) *\/ */
289
-/* 716, /\* (1) *\/ */
286
+/* 676, /\* (1) *\/ */
287
+/* 700, /\* (1) *\/ */
288
+/* 712, /\* (1) *\/ */
289
+/* 768, /\* (1) *\/ */
290 290
 /* 772, /\* (1) *\/ */
291
-/* 776, /\* (1) *\/ */
292
-1032, /* (7549) */
293
-/* 1044, /\* (14) *\/ */
294
-2076, /* (14) */
295
-4116, /* (9) */
296
-8212, /* (6) */
297
-16404, /* (4) */
298
-63504, /* (7) */
299
-135636, /* (2) */
300
-253992, /* (7) */
301
-1050864, /* (1) */
291
+1028, /* (7585) */
292
+1032, /* (14) */
293
+2084, /* (14) */
294
+4124, /* (9) */
295
+8220, /* (6) */
296
+16412, /* (4) */
297
+63500, /* (7) */
298
+136348, /* (1) */
299
+253988, /* (7) */
300
+1050860, /* (1) */
302 301
 2097152
303 302
 };
304 303
 #endif
... ...
@@ -317,8 +324,10 @@ struct MP {
317 317
 };
318 318
 
319 319
 struct FRAG {
320
-  struct FRAG *next;
321
-  unsigned int sbits;
320
+  union {
321
+    struct FRAG *next;
322
+    unsigned int sbits;
323
+  } u;
322 324
 #ifdef CL_DEBUG
323 325
   unsigned int magic;
324 326
 #endif
... ...
@@ -349,9 +358,6 @@ struct MP *mp_create() {
349 349
   unsigned int sz;
350 350
   memset(&mp, 0, sizeof(mp));
351 351
   mp.psize = getpagesize();
352
-#ifdef DEBUGMPOOL
353
-  lfd = fopen("mmpool_log", "w");
354
-#endif
355 352
   sz = align_to_pagesize(&mp, MIN_FRAGSIZE);
356 353
   mp.mpm.usize = align_to_voidptr(sizeof(struct MPMAP));
357 354
   mp.mpm.size = sz - align_to_voidptr(sizeof(mp));
... ...
@@ -425,7 +431,8 @@ void *mp_malloc(struct MP *mp, size_t size) {
425 425
   /* Case 1: We have a free'd frag */
426 426
   if((f = mp->avail[sbits])) {
427 427
     spam("malloc %p size %u (freed)\n", f, mp_roundup(size));
428
-    mp->avail[sbits] = f->next;
428
+    mp->avail[sbits] = f->u.next;
429
+    f->u.sbits = sbits;
429 430
 #ifdef CL_DEBUG
430 431
       f->magic = MPOOLMAGIC;
431 432
 #endif
... ...
@@ -443,7 +450,7 @@ void *mp_malloc(struct MP *mp, size_t size) {
443 443
       f = (struct FRAG *)((void *)mpm + mpm->usize);
444 444
       spam("malloc %p size %u (hole)\n", f, mp_roundup(size));
445 445
       mpm->usize += needed;
446
-      f->sbits = sbits;
446
+      f->u.sbits = sbits;
447 447
 #ifdef CL_DEBUG
448 448
       f->magic = MPOOLMAGIC;
449 449
 #endif
... ...
@@ -469,7 +476,7 @@ void *mp_malloc(struct MP *mp, size_t size) {
469 469
   mp->mpm.next = mpm;
470 470
   f = (struct FRAG *)((void *)mpm + align_to_voidptr(sizeof(*mpm)));
471 471
   spam("malloc %p size %u (new map)\n", f, mp_roundup(size));
472
-  f->sbits = sbits;
472
+  f->u.sbits = sbits;
473 473
 #ifdef CL_DEBUG
474 474
       f->magic = MPOOLMAGIC;
475 475
 #endif
... ...
@@ -478,14 +485,16 @@ void *mp_malloc(struct MP *mp, size_t size) {
478 478
 
479 479
 void mp_free(struct MP *mp, void *ptr) {
480 480
   struct FRAG *f = (struct FRAG *)(ptr - FRAG_OVERHEAD);
481
+  unsigned int sbits;
481 482
   if (!ptr) return;
482 483
 
483 484
 #ifdef CL_DEBUG
484 485
   assert(f->magic == MPOOLMAGIC && "Attempt to mp_free a pointer we did not allocate!");
485 486
 #endif
486 487
 
487
-  f->next = mp->avail[f->sbits];
488
-  mp->avail[f->sbits] = f;
488
+  sbits = f->u.sbits;
489
+  f->u.next = mp->avail[sbits];
490
+  mp->avail[sbits] = f;
489 491
   spam("free @ %p\n", f);
490 492
 }
491 493
 
... ...
@@ -501,17 +510,18 @@ void *mp_calloc(struct MP *mp, size_t nmemb, size_t size) {
501 501
 
502 502
 void *mp_realloc(struct MP *mp, void *ptr, size_t size) {
503 503
   struct FRAG *f = (struct FRAG *)(ptr - FRAG_OVERHEAD);
504
-  unsigned int csize;
504
+  unsigned int csize, sbits;
505 505
   void *new_ptr;
506 506
   if (!ptr) return mp_malloc(mp, size);
507 507
 
508
-  spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->sbits), size);
509
-  if(!size || !(csize = from_bits(f->sbits))) {
508
+  spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->u.sbits), size);
509
+  if(!size || !(csize = from_bits(f->u.sbits))) {
510 510
     cli_errmsg("mp_realloc(): Attempt to allocate %lu bytes. Please report to http://bugs.clamav.net\n", (unsigned long int) size);
511 511
     return NULL;
512 512
   }
513 513
   csize -= FRAG_OVERHEAD;
514
-  if (csize >= size) return ptr;
514
+  if (csize >= size && (!f->u.sbits || from_bits(f->u.sbits-1)-FRAG_OVERHEAD < size))
515
+    return ptr;
515 516
   if (!(new_ptr = mp_malloc(mp, size)))
516 517
     return NULL;
517 518
   memcpy(new_ptr, ptr, csize);
... ...
@@ -525,14 +535,15 @@ void *mp_realloc2(struct MP *mp, void *ptr, size_t size) {
525 525
   void *new_ptr;
526 526
   if (!ptr) return mp_malloc(mp, size);
527 527
 
528
-  spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->sbits), size);
529
-  if(!size || !(csize = from_bits(f->sbits))) {
528
+  spam("realloc @ %p (size %u -> %u))\n", f, from_bits(f->u.sbits), size);
529
+  if(!size || !(csize = from_bits(f->u.sbits))) {
530 530
     cli_errmsg("mp_realloc2(): Attempt to allocate %lu bytes. Please report to http://bugs.clamav.net\n", (unsigned long int) size);
531 531
     mp_free(mp, ptr);
532 532
     return NULL;
533 533
   }
534 534
   csize -= FRAG_OVERHEAD;
535
-  if (csize >= size) return ptr;
535
+  if (csize >= size && (!f->u.sbits || from_bits(f->u.sbits-1)-FRAG_OVERHEAD < size))
536
+    return ptr;
536 537
   if ((new_ptr = mp_malloc(mp, size)))
537 538
     memcpy(new_ptr, ptr, csize);
538 539
   mp_free(mp, ptr);