diff options
Diffstat (limited to 'lib/talloc')
-rw-r--r-- | lib/talloc/talloc.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/talloc/talloc.c b/lib/talloc/talloc.c index e68b6539dc..a23df38b56 100644 --- a/lib/talloc/talloc.c +++ b/lib/talloc/talloc.c @@ -57,7 +57,9 @@ #define MAX_TALLOC_SIZE 0x10000000 -#define TALLOC_MAGIC 0xe814ec70 +#define TALLOC_MAGIC_V1 0xe814ec70 +#define TALLOC_MAGIC_V2 0xe814ec80 +#define TALLOC_MAGIC TALLOC_MAGIC_V2 #define TALLOC_FLAG_FREE 0x01 #define TALLOC_FLAG_LOOP 0x02 #define TALLOC_FLAG_POOL 0x04 /* This is a talloc pool */ @@ -155,6 +157,11 @@ static void talloc_abort(const char *reason) talloc_abort_fn(reason); } +static void talloc_abort_magic_v1(void) +{ + talloc_abort("Bad talloc magic value - old magic v1 used"); +} + static void talloc_abort_double_free(void) { talloc_abort("Bad talloc magic value - double free"); @@ -171,6 +178,10 @@ static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) const char *pp = (const char *)ptr; struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE); if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) { + if ((tc->flags & (~0xF)) == TALLOC_MAGIC_V1) { + talloc_abort_magic_v1(); + } + if (tc->flags & TALLOC_FLAG_FREE) { talloc_abort_double_free(); } else { |