compositor-rdp: rdp_destroy() double free error #91457
authorDawid Gajownik <gajownik@gmail.com>
Wed, 5 Aug 2015 20:21:28 +0000 (17:21 -0300)
committerDaniel Stone <daniels@collabora.com>
Thu, 6 Aug 2015 15:10:57 +0000 (16:10 +0100)
When something goes wrong during weston initialization,
weston_compositor_destroy() is executed. It destroys the backend and
then frees compositor memory. Unfortunately RDP backend is not correctly
destroyed. It frees compositor instead of a backend memory. This causes
later a double free error. The easiest way to reproduce a problem is to
run weston with an invalid option.

Additionally some other objects of rdp_backend structure are not
destroyed/freed. The patch fixes both issues.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=91457

v3: comply with Weston coding style, this time for real
v2: comply with Weston coding style

Signed-off-by: Dawid Gajownik <gajownik@gmail.com>
Reviewed-by: David FORT <contact@hardening-consulting.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
src/compositor-rdp.c

index 6eac7f9..869c3f3 100644 (file)
@@ -541,9 +541,20 @@ rdp_restore(struct weston_compositor *ec)
 static void
 rdp_destroy(struct weston_compositor *ec)
 {
+       struct rdp_backend *b = (struct rdp_backend *) ec->backend;
+       int i;
+
        weston_compositor_shutdown(ec);
+       for (i = 0; i < MAX_FREERDP_FDS; i++)
+               if (b->listener_events[i])
+                       wl_event_source_remove(b->listener_events[i]);
+
+       freerdp_listener_free(b->listener);
 
-       free(ec);
+       free(b->server_cert);
+       free(b->server_key);
+       free(b->rdp_key);
+       free(b);
 }
 
 static