summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 --*/