summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2015-07-07 21:44:19 +0200
committerPeter Wu <peter@lekensteyn.nl>2015-07-07 21:46:49 +0200
commitb7da5beda46b52a8016900bc8078eaff60844b54 (patch)
tree59f60b28fdee9e416b04605587ba15198516c751
parentb3fc17453bf586a99879a7bba03122a4f0b7aa6d (diff)
downloadlibgcrypt-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.c5
-rw-r--r--src/g10lib.h17
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 --*/