diff options
author | Peter Wu <peter@lekensteyn.nl> | 2015-07-07 21:44:19 +0200 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2015-07-07 21:46:49 +0200 |
commit | b7da5beda46b52a8016900bc8078eaff60844b54 (patch) | |
tree | 59f60b28fdee9e416b04605587ba15198516c751 | |
parent | b3fc17453bf586a99879a7bba03122a4f0b7aa6d (diff) | |
download | libgcrypt-b7da5beda46b52a8016900bc8078eaff60844b54.tar.gz |
Add LSan annotation to ignore a memory leak
* src/g10lib.h: Add annotate_leaked_object macro that ignores leaked
objects. This avoids LSan from reporting deliberately leaked memory.
* mpi/mpiutil.c: Mark "constant" MPIs as leaked.
Signed-off-by: Peter Wu <peter@lekensteyn.nl>
-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 --*/ |