[gs-commits] mupdf 1.16.1.70 Memento: Ensure that we breakpoint on fir
[email protected] (Robin Watts) Thu, 3 Oct 2019 15:19:03 +0000 (UTC)
| Newsgroups | gmane.comp.printing.ghostscript.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 28d615dcdc435e08ec5bee809aae84a40fd0294a Author: Robin Watts <[email protected]> Date: Tue Oct 1 13:49:45 2019 +0100 Memento: Ensure that we breakpoint on first detecting corruption. Each block is only breakpointed on once though. diff --git a/source/fitz/memento.c b/source/fitz/memento.c index ddd0a65..715800f 100644 --- a/source/fitz/memento.c +++ b/source/fitz/memento.c @@ -252,7 +252,8 @@ enum { Memento_Flag_BreakOnFree = 4, Memento_Flag_BreakOnRealloc = 8, Memento_Flag_Freed = 16, - Memento_Flag_KnownLeak = 32 + Memento_Flag_KnownLeak = 32, + Memento_Flag_Reported = 64 }; enum { @@ -1103,7 +1104,7 @@ static int Memento_Internal_checkFreedBlock(Memento_BlkHeader *b, void *arg) goto mismatch4; p += 4; i -= 4; - } while (i > 0); + } while (i > 0); i += 4; } if (i & 2) { @@ -2044,112 +2045,112 @@ static void do_reference(Memento_BlkHeader *blk, int event) int Memento_checkPointerOrNull(void *blk) { - if (blk == NULL) - return 0; - if (blk == MEMENTO_PREFILL_PTR) - fprintf(stderr, "Prefill value found as pointer - buffer underrun?\n"); - else if (blk == MEMENTO_POSTFILL_PTR) - fprintf(stderr, "Postfill value found as pointer - buffer overrun?\n"); - else if (blk == MEMENTO_ALLOCFILL_PTR) - fprintf(stderr, "Allocfill value found as pointer - use of uninitialised value?\n"); - else if (blk == MEMENTO_FREEFILL_PTR) - fprintf(stderr, "Allocfill value found as pointer - use after free?\n"); - else - return 0; + if (blk == NULL) + return 0; + if (blk == MEMENTO_PREFILL_PTR) + fprintf(stderr, "Prefill value found as pointer - buffer underrun?\n"); + else if (blk == MEMENTO_POSTFILL_PTR) + fprintf(stderr, "Postfill value found as pointer - buffer overrun?\n"); + else if (blk == MEMENTO_ALLOCFILL_PTR) + fprintf(stderr, "Allocfill value found as pointer - use of uninitialised value?\n"); + else if (blk == MEMENTO_FREEFILL_PTR) + fprintf(stderr, "Allocfill value found as pointer - use after free?\n"); + else + return 0; #ifdef MEMENTO_DETAILS - fprintf(stderr, "Current backtrace:\n"); - Memento_bt(); - fprintf(stderr, "History:\n"); - Memento_info(blk); + fprintf(stderr, "Current backtrace:\n"); + Memento_bt(); + fprintf(stderr, "History:\n"); + Memento_info(blk); #endif - return 1; + return 1; } int Memento_checkBytePointerOrNull(void *blk) { - unsigned char i; - if (blk == NULL) - return 0; - Memento_checkPointerOrNull(blk); - - i = *(unsigned int *)blk; - - if (i == MEMENTO_PREFILL_UBYTE) - fprintf(stderr, "Prefill value found - buffer underrun?\n"); - else if (i == MEMENTO_POSTFILL_UBYTE) - fprintf(stderr, "Postfill value found - buffer overrun?\n"); - else if (i == MEMENTO_ALLOCFILL_UBYTE) - fprintf(stderr, "Allocfill value found - use of uninitialised value?\n"); - else if (i == MEMENTO_FREEFILL_UBYTE) - fprintf(stderr, "Allocfill value found - use after free?\n"); - else - return 0; + unsigned char i; + if (blk == NULL) + return 0; + Memento_checkPointerOrNull(blk); + + i = *(unsigned int *)blk; + + if (i == MEMENTO_PREFILL_UBYTE) + fprintf(stderr, "Prefill value found - buffer underrun?\n"); + else if (i == MEMENTO_POSTFILL_UBYTE) + fprintf(stderr, "Postfill value found - buffer overrun?\n"); + else if (i == MEMENTO_ALLOCFILL_UBYTE) + fprintf(stderr, "Allocfill value found - use of uninitialised value?\n"); + else if (i == MEMENTO_FREEFILL_UBYTE) + fprintf(stderr, "Allocfill value found - use after free?\n"); + else + return 0; #ifdef MEMENTO_DETAILS - fprintf(stderr, "Current backtrace:\n"); - Memento_bt(); - fprintf(stderr, "History:\n"); - Memento_info(blk); + fprintf(stderr, "Current backtrace:\n"); + Memento_bt(); + fprintf(stderr, "History:\n"); + Memento_info(blk); #endif - Memento_breakpoint(); - return 1; + Memento_breakpoint(); + return 1; } int Memento_checkShortPointerOrNull(void *blk) { - unsigned short i; - if (blk == NULL) - return 0; - Memento_checkPointerOrNull(blk); - - i = *(unsigned short *)blk; - - if (i == MEMENTO_PREFILL_USHORT) - fprintf(stderr, "Prefill value found - buffer underrun?\n"); - else if (i == MEMENTO_POSTFILL_USHORT) - fprintf(stderr, "Postfill value found - buffer overrun?\n"); - else if (i == MEMENTO_ALLOCFILL_USHORT) - fprintf(stderr, "Allocfill value found - use of uninitialised value?\n"); - else if (i == MEMENTO_FREEFILL_USHORT) - fprintf(stderr, "Allocfill value found - use after free?\n"); - else - return 0; + unsigned short i; + if (blk == NULL) + return 0; + Memento_checkPointerOrNull(blk); + + i = *(unsigned short *)blk; + + if (i == MEMENTO_PREFILL_USHORT) + fprintf(stderr, "Prefill value found - buffer underrun?\n"); + else if (i == MEMENTO_POSTFILL_USHORT) + fprintf(stderr, "Postfill value found - buffer overrun?\n"); + else if (i == MEMENTO_ALLOCFILL_USHORT) + fprintf(stderr, "Allocfill value found - use of uninitialised value?\n"); + else if (i == MEMENTO_FREEFILL_USHORT) + fprintf(stderr, "Allocfill value found - use after free?\n"); + else + return 0; #ifdef MEMENTO_DETAILS - fprintf(stderr, "Current backtrace:\n"); - Memento_bt(); - fprintf(stderr, "History:\n"); - Memento_info(blk); + fprintf(stderr, "Current backtrace:\n"); + Memento_bt(); + fprintf(stderr, "History:\n"); + Memento_info(blk); #endif - Memento_breakpoint(); - return 1; + Memento_breakpoint(); + return 1; } int Memento_checkIntPointerOrNull(void *blk) { - unsigned int i; - if (blk == NULL) - return 0; - Memento_checkPointerOrNull(blk); - - i = *(unsigned int *)blk; - - if (i == MEMENTO_PREFILL_UINT) - fprintf(stderr, "Prefill value found - buffer underrun?\n"); - else if (i == MEMENTO_POSTFILL_UINT) - fprintf(stderr, "Postfill value found - buffer overrun?\n"); - else if (i == MEMENTO_ALLOCFILL_UINT) - fprintf(stderr, "Allocfill value found - use of uninitialised value?\n"); - else if (i == MEMENTO_FREEFILL_UINT) - fprintf(stderr, "Allocfill value found - use after free?\n"); - else - return 0; + unsigned int i; + if (blk == NULL) + return 0; + Memento_checkPointerOrNull(blk); + + i = *(unsigned int *)blk; + + if (i == MEMENTO_PREFILL_UINT) + fprintf(stderr, "Prefill value found - buffer underrun?\n"); + else if (i == MEMENTO_POSTFILL_UINT) + fprintf(stderr, "Postfill value found - buffer overrun?\n"); + else if (i == MEMENTO_ALLOCFILL_UINT) + fprintf(stderr, "Allocfill value found - use of uninitialised value?\n"); + else if (i == MEMENTO_FREEFILL_UINT) + fprintf(stderr, "Allocfill value found - use after free?\n"); + else + return 0; #ifdef MEMENTO_DETAILS - fprintf(stderr, "Current backtrace:\n"); - Memento_bt(); - fprintf(stderr, "History:\n"); - Memento_info(blk); + fprintf(stderr, "Current backtrace:\n"); + Memento_bt(); + fprintf(stderr, "History:\n"); + Memento_info(blk); #endif - Memento_breakpoint(); - return 1; + Memento_breakpoint(); + return 1; } static void *do_takeRef(void *blk) @@ -2348,7 +2349,11 @@ static int checkBlockUser(Memento_BlkHeader *memblk, const char *action) } fprintf(stderr, "Block last checked OK at allocation %d. Now %d.\n", memblk->lastCheckedOK, memento.sequence); - Memento_breakpointLocked(); + if ((memblk->flags & Memento_Flag_Reported) == 0) + { + memblk->flags |= Memento_Flag_Reported; + Memento_breakpointLocked(); + } return 1; } #endif @@ -2395,7 +2400,11 @@ static int checkBlock(Memento_BlkHeader *memblk, const char *action) } fprintf(stderr, "Block last checked OK at allocation %d. Now %d.\n", memblk->lastCheckedOK, memento.sequence); - Memento_breakpointLocked(); + if ((memblk->flags & Memento_Flag_Reported) == 0) + { + memblk->flags |= Memento_Flag_Reported; + Memento_breakpointLocked(); + } return 1; } #endif @@ -2586,6 +2595,11 @@ static int Memento_Internal_checkAllAlloced(Memento_BlkHeader *memblk, void *arg data->preCorrupt = 0; data->postCorrupt = 0; data->freeCorrupt = 0; + if ((memblk->flags & Memento_Flag_Reported) == 0) + { + memblk->flags |= Memento_Flag_Reported; + Memento_breakpointLocked(); + } } else memblk->lastCheckedOK = memento.sequence; @@ -2628,6 +2642,11 @@ static int Memento_Internal_checkAllFreed(Memento_BlkHeader *memblk, void *arg) data->preCorrupt = 0; data->postCorrupt = 0; data->freeCorrupt = 0; + if ((memblk->flags & Memento_Flag_Reported) == 0) + { + memblk->flags |= Memento_Flag_Reported; + Memento_breakpointLocked(); + } } else memblk->lastCheckedOK = memento.sequence; http://git.ghostscript.com/?p=mupdf.git;a=commit;h=28d615dcdc435e08ec5bee809aae84a40fd0294a -- MuPDF library Artifex Software, Inc.