Add usize sanity checking to quarantine.

This commit is contained in:
Jason Evans 2012-04-23 21:43:18 -07:00
parent 577dd84660
commit 9cd351d147

View File

@ -11,15 +11,21 @@
/******************************************************************************/ /******************************************************************************/
/* Data. */ /* Data. */
typedef struct quarantine_obj_s quarantine_obj_t;
typedef struct quarantine_s quarantine_t; typedef struct quarantine_s quarantine_t;
struct quarantine_obj_s {
void *ptr;
size_t usize;
};
struct quarantine_s { struct quarantine_s {
size_t curbytes; size_t curbytes;
size_t curobjs; size_t curobjs;
size_t first; size_t first;
#define LG_MAXOBJS_INIT 10 #define LG_MAXOBJS_INIT 10
size_t lg_maxobjs; size_t lg_maxobjs;
void *objs[1]; /* Dynamically sized ring buffer. */ quarantine_obj_t objs[1]; /* Dynamically sized ring buffer. */
}; };
static void quarantine_cleanup(void *arg); static void quarantine_cleanup(void *arg);
@ -43,7 +49,7 @@ quarantine_init(size_t lg_maxobjs)
quarantine_t *quarantine; quarantine_t *quarantine;
quarantine = (quarantine_t *)imalloc(offsetof(quarantine_t, objs) + quarantine = (quarantine_t *)imalloc(offsetof(quarantine_t, objs) +
((ZU(1) << lg_maxobjs) * sizeof(void *))); ((ZU(1) << lg_maxobjs) * sizeof(quarantine_obj_t)));
if (quarantine == NULL) if (quarantine == NULL)
return (NULL); return (NULL);
quarantine->curbytes = 0; quarantine->curbytes = 0;
@ -70,14 +76,14 @@ quarantine_grow(quarantine_t *quarantine)
quarantine->lg_maxobjs)) { quarantine->lg_maxobjs)) {
/* objs ring buffer data are contiguous. */ /* objs ring buffer data are contiguous. */
memcpy(ret->objs, &quarantine->objs[quarantine->first], memcpy(ret->objs, &quarantine->objs[quarantine->first],
quarantine->curobjs * sizeof(void *)); quarantine->curobjs * sizeof(quarantine_obj_t));
ret->curobjs = quarantine->curobjs; ret->curobjs = quarantine->curobjs;
} else { } else {
/* objs ring buffer data wrap around. */ /* objs ring buffer data wrap around. */
size_t ncopy = (ZU(1) << quarantine->lg_maxobjs) - size_t ncopy = (ZU(1) << quarantine->lg_maxobjs) -
quarantine->first; quarantine->first;
memcpy(ret->objs, &quarantine->objs[quarantine->first], ncopy * memcpy(ret->objs, &quarantine->objs[quarantine->first], ncopy *
sizeof(void *)); sizeof(quarantine_obj_t));
ret->curobjs = ncopy; ret->curobjs = ncopy;
if (quarantine->curobjs != 0) { if (quarantine->curobjs != 0) {
memcpy(&ret->objs[ret->curobjs], quarantine->objs, memcpy(&ret->objs[ret->curobjs], quarantine->objs,
@ -93,10 +99,10 @@ quarantine_drain(quarantine_t *quarantine, size_t upper_bound)
{ {
while (quarantine->curbytes > upper_bound && quarantine->curobjs > 0) { while (quarantine->curbytes > upper_bound && quarantine->curobjs > 0) {
void *ptr = quarantine->objs[quarantine->first]; quarantine_obj_t *obj = &quarantine->objs[quarantine->first];
size_t usize = isalloc(ptr, config_prof); assert(obj->usize == isalloc(obj->ptr, config_prof));
idalloc(ptr); idalloc(obj->ptr);
quarantine->curbytes -= usize; quarantine->curbytes -= obj->usize;
quarantine->curobjs--; quarantine->curobjs--;
quarantine->first = (quarantine->first + 1) & ((ZU(1) << quarantine->first = (quarantine->first + 1) & ((ZU(1) <<
quarantine->lg_maxobjs) - 1); quarantine->lg_maxobjs) - 1);
@ -151,7 +157,9 @@ quarantine(void *ptr)
if (quarantine->curbytes + usize <= opt_quarantine) { if (quarantine->curbytes + usize <= opt_quarantine) {
size_t offset = (quarantine->first + quarantine->curobjs) & size_t offset = (quarantine->first + quarantine->curobjs) &
((ZU(1) << quarantine->lg_maxobjs) - 1); ((ZU(1) << quarantine->lg_maxobjs) - 1);
quarantine->objs[offset] = ptr; quarantine_obj_t *obj = &quarantine->objs[offset];
obj->ptr = ptr;
obj->usize = usize;
quarantine->curbytes += usize; quarantine->curbytes += usize;
quarantine->curobjs++; quarantine->curobjs++;
if (opt_junk) if (opt_junk)