If INVARIANTS is specified, add ctor/dtor to junk memory if they are

unspecified...

Submitted by:	Suresh Gumpula at Netapp
Differential Revision:	https://reviews.freebsd.org/D2725
This commit is contained in:
John-Mark Gurney 2015-06-25 20:44:46 +00:00
parent de5ab6b0ab
commit afc6dc3669
2 changed files with 19 additions and 0 deletions

View File

@ -1940,6 +1940,20 @@ uma_zcreate(const char *name, size_t size, uma_ctor ctor, uma_dtor dtor,
args.dtor = dtor;
args.uminit = uminit;
args.fini = fini;
#ifdef INVARIANTS
/*
* If a zone is being created with an empty constructor and
* destructor, pass UMA constructor/destructor which checks for
* memory use after free.
*/
if ((!(flags & UMA_ZONE_ZINIT)) && ctor == NULL && dtor == NULL &&
uminit == NULL && fini == NULL) {
args.ctor = trash_ctor;
args.dtor = trash_dtor;
args.uminit = trash_init;
args.fini = trash_fini;
}
#endif
args.align = align;
args.flags = flags;
args.keg = NULL;

View File

@ -69,8 +69,13 @@ trash_ctor(void *mem, int size, void *arg, int flags)
for (p = mem; cnt > 0; cnt--, p++)
if (*p != uma_junk) {
#ifdef INVARIANTS
panic("Memory modified after free %p(%d) val=%x @ %p\n",
mem, size, *p, p);
#else
printf("Memory modified after free %p(%d) val=%x @ %p\n",
mem, size, *p, p);
#endif
return (0);
}
return (0);