Siarhei Siamashka
2017-09-18 10:46:06 UTC
This fixes a few small memory leaks detected by valgrind. This memory
was allocated once on pixman library load and never freed (but still
was reachable). The fix only helps if the compiler has support for
__attribute__((constructor)) and __attribute__((destructor))
function attributes.
Reported-by: Emil Velikov <***@gmail.com>
Signed-off-by: Siarhei Siamashka <***@gmail.com>
---
configure.ac | 1 +
pixman/pixman.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/configure.ac b/configure.ac
index e833e45..a592cba 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1047,6 +1047,7 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([[
*/
static int x = 1;
static void __attribute__((constructor)) constructor_function () { x = 0; }
+static void __attribute__((destructor)) destructor_function () { x = 0; }
int main (void) { return x; }
#else
#error not gcc or gcc version is older than 2.7
diff --git a/pixman/pixman.c b/pixman/pixman.c
index f932eac..0bcc832 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -38,6 +38,18 @@ pixman_constructor (void)
{
global_implementation = _pixman_choose_implementation ();
}
+
+static void __attribute__((destructor))
+pixman_destructor (void)
+{
+ pixman_implementation_t *imp = global_implementation;
+ while (imp)
+ {
+ pixman_implementation_t *fallback = imp->fallback;
+ free (imp);
+ imp = fallback;
+ }
+}
#endif
typedef struct operator_info_t operator_info_t;
was allocated once on pixman library load and never freed (but still
was reachable). The fix only helps if the compiler has support for
__attribute__((constructor)) and __attribute__((destructor))
function attributes.
Reported-by: Emil Velikov <***@gmail.com>
Signed-off-by: Siarhei Siamashka <***@gmail.com>
---
configure.ac | 1 +
pixman/pixman.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/configure.ac b/configure.ac
index e833e45..a592cba 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1047,6 +1047,7 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([[
*/
static int x = 1;
static void __attribute__((constructor)) constructor_function () { x = 0; }
+static void __attribute__((destructor)) destructor_function () { x = 0; }
int main (void) { return x; }
#else
#error not gcc or gcc version is older than 2.7
diff --git a/pixman/pixman.c b/pixman/pixman.c
index f932eac..0bcc832 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -38,6 +38,18 @@ pixman_constructor (void)
{
global_implementation = _pixman_choose_implementation ();
}
+
+static void __attribute__((destructor))
+pixman_destructor (void)
+{
+ pixman_implementation_t *imp = global_implementation;
+ while (imp)
+ {
+ pixman_implementation_t *fallback = imp->fallback;
+ free (imp);
+ imp = fallback;
+ }
+}
#endif
typedef struct operator_info_t operator_info_t;
--
2.7.3
2.7.3