diff options
-rw-r--r-- | mpi/mpiutil.c | 5 | ||||
-rw-r--r-- | src/g10lib.h | 17 |
2 files changed, 21 insertions, 1 deletions
diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c index 71b3f1c3..9a796c68 100644 --- a/mpi/mpiutil.c +++ b/mpi/mpiutil.c @@ -211,7 +211,10 @@ _gcry_mpi_free( gcry_mpi_t a ) if (!a ) return; if ((a->flags & 32)) - return; /* Never release a constant. */ + { + annotate_leaked_object(a); + return; /* Never release a constant. */ + } if ((a->flags & 4)) xfree( a->d ); else diff --git a/src/g10lib.h b/src/g10lib.h index 50a08ec8..5793f8ca 100644 --- a/src/g10lib.h +++ b/src/g10lib.h @@ -88,6 +88,16 @@ #define DIM(v) (sizeof(v)/sizeof((v)[0])) #define DIMof(type,member) DIM(((type *)0)->member) +/* Detect LeakSanitizer (LSan) support for GCC and Clang based on the + availability of AddressSanitizer (ASAN). */ +#ifdef __SANITIZE_ADDRESS__ +# define LEAK_SANITIZER +#elif defined(__has_feature) +# if __has_feature(address_sanitizer) +# define LEAK_SANITIZER +# endif +#endif + /*-- src/global.c -*/ @@ -126,6 +136,13 @@ int _gcry_is_secure (const void *a) _GCRY_GCC_ATTR_PURE; #define xstrdup(a) _gcry_xstrdup ((a)) #define xfree(a) _gcry_free ((a)) +/* Allows "constant" MPIs to be annotated as memory leak. */ +#ifdef LEAK_SANITIZER +# include <sanitizer/lsan_interface.h> +# define annotate_leaked_object(a) __lsan_ignore_object((a)) +#else +# define annotate_leaked_object(a) do { } while (0) +#endif /*-- src/misc.c --*/ |