this one I could have seen by myself if not for the late time of the day
This commit is contained in:
parent
e56b1f628e
commit
7cbc0b6fa2
45
aalloc.c
45
aalloc.c
@ -1,6 +1,6 @@
|
|||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/aalloc.c,v 1.2 2008/11/12 04:59:42 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/aalloc.c,v 1.3 2008/11/12 05:05:17 tg Exp $");
|
||||||
|
|
||||||
/* mksh integration of aalloc */
|
/* mksh integration of aalloc */
|
||||||
|
|
||||||
@ -118,6 +118,7 @@ static size_t pagesz;
|
|||||||
size, "value plus extra too big"); \
|
size, "value plus extra too big"); \
|
||||||
} while (/* CONSTCOND */ 0)
|
} while (/* CONSTCOND */ 0)
|
||||||
|
|
||||||
|
static void adelete_leak(PArea, PBlock);
|
||||||
static PBlock check_bp(PArea, const char *, TCookie);
|
static PBlock check_bp(PArea, const char *, TCookie);
|
||||||
static TPtr *check_ptr(void *, PArea, PBlock *, const char *, const char *);
|
static TPtr *check_ptr(void *, PArea, PBlock *, const char *, const char *);
|
||||||
|
|
||||||
@ -259,20 +260,8 @@ track_check(void)
|
|||||||
if (bp->last == &bp->storage) {
|
if (bp->last == &bp->storage) {
|
||||||
AALLOC_WARN("leaking empty area %p (%p %tu)", ap,
|
AALLOC_WARN("leaking empty area %p (%p %tu)", ap,
|
||||||
bp, bp->endp - bp);
|
bp, bp->endp - bp);
|
||||||
goto track_freebp;
|
} else
|
||||||
}
|
adelete_leak(ap, bp);
|
||||||
while (bp->last > &bp->storage) {
|
|
||||||
TPtr *cp;
|
|
||||||
|
|
||||||
bp->last -= PVALIGN;
|
|
||||||
cp = *((void **)bp->last);
|
|
||||||
cp->iv ^= bp->cookie;
|
|
||||||
AALLOC_WARN("leaking %s pointer %p in area %p (%p %tu)",
|
|
||||||
cp->pv == bp->last ? "valid" : "underflown",
|
|
||||||
(char *)cp + PVALIGN, ap, bp, bp->endp - bp);
|
|
||||||
free(cp);
|
|
||||||
}
|
|
||||||
track_freebp:
|
|
||||||
free(bp);
|
free(bp);
|
||||||
track_next:
|
track_next:
|
||||||
track = ap->prev.pv;
|
track = ap->prev.pv;
|
||||||
@ -281,6 +270,22 @@ track_check(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
adelete_leak(PArea ap, PBlock bp)
|
||||||
|
{
|
||||||
|
TPtr *cp;
|
||||||
|
|
||||||
|
while (bp->last > (void *)&bp->storage) {
|
||||||
|
bp->last -= PVALIGN;
|
||||||
|
cp = *((void **)bp->last);
|
||||||
|
cp->iv ^= bp->cookie;
|
||||||
|
AALLOC_WARN("leaking %s pointer %p in area %p (%p %tu)",
|
||||||
|
cp->pv == bp->last ? "valid" : "underflown",
|
||||||
|
(char *)cp + PVALIGN, ap, bp, bp->endp - (void *)bp);
|
||||||
|
free(cp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
adelete(PArea *pap)
|
adelete(PArea *pap)
|
||||||
{
|
{
|
||||||
@ -289,13 +294,13 @@ adelete(PArea *pap)
|
|||||||
#endif
|
#endif
|
||||||
PBlock bp;
|
PBlock bp;
|
||||||
|
|
||||||
if ((bp = check_bp(*pap, "adelete", 0)) == NULL)
|
/* ignore invalid areas */
|
||||||
goto adelete_freeap; /* ignore invalid areas */
|
if ((bp = check_bp(*pap, "adelete", 0)) == NULL) {
|
||||||
|
|
||||||
if (bp->last != &bp->storage)
|
if (bp->last != &bp->storage)
|
||||||
adelete_leak(bp);
|
adelete_leak(*pap, bp);
|
||||||
free(bp);
|
free(bp);
|
||||||
adelete_freeap:
|
}
|
||||||
|
|
||||||
#ifdef AALLOC_TRACK
|
#ifdef AALLOC_TRACK
|
||||||
if (track == *pap) {
|
if (track == *pap) {
|
||||||
(*pap)->prev.iv ^= gcookie;
|
(*pap)->prev.iv ^= gcookie;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user