aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-11-01 14:44:38 -0400
committerGitHub <noreply@github.com>2017-11-01 14:44:38 -0400
commit697a24137b67bb50b52c5307a3f7cdebbc9509b8 (patch)
treef3234f8f9ede9c1ba7a8d918b022a86a0d3c7986 /backend
parent1d0973f6c86ac62f03cbec89ceee5211c21dbab1 (diff)
parente3ee2cd9c7e9abe6614dded927787f8138f739f4 (diff)
Merge pull request #376 from martinetd/rootston_exit
Fix rootston exit segfaults
Diffstat (limited to 'backend')
-rw-r--r--backend/drm/backend.c4
-rw-r--r--backend/drm/drm.c2
-rw-r--r--backend/libinput/backend.c7
-rw-r--r--backend/libinput/events.c1
4 files changed, 8 insertions, 6 deletions
diff --git a/backend/drm/backend.c b/backend/drm/backend.c
index af2619ff..87a4f708 100644
--- a/backend/drm/backend.c
+++ b/backend/drm/backend.c
@@ -29,8 +29,8 @@ static void wlr_drm_backend_destroy(struct wlr_backend *backend) {
wlr_drm_restore_outputs(drm);
- struct wlr_drm_connector *conn;
- wl_list_for_each(conn, &drm->outputs, link) {
+ struct wlr_drm_connector *conn, *next;
+ wl_list_for_each_safe(conn, next, &drm->outputs, link) {
wlr_output_destroy(&conn->output);
}
diff --git a/backend/drm/drm.c b/backend/drm/drm.c
index 08e6296b..dd247998 100644
--- a/backend/drm/drm.c
+++ b/backend/drm/drm.c
@@ -645,6 +645,7 @@ static void wlr_drm_connector_destroy(struct wlr_output *output) {
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
wlr_drm_connector_cleanup(conn);
wl_event_source_remove(conn->retry_pageflip);
+ wl_list_remove(&conn->link);
free(conn);
}
@@ -823,6 +824,7 @@ void wlr_drm_scan_connectors(struct wlr_drm_backend *drm) {
drmModeFreeCrtc(conn->old_crtc);
wl_event_source_remove(conn->retry_pageflip);
+ wl_list_remove(&conn->link);
free(conn);
}
}
diff --git a/backend/libinput/backend.c b/backend/libinput/backend.c
index 781314a3..7e4d5700 100644
--- a/backend/libinput/backend.c
+++ b/backend/libinput/backend.c
@@ -99,13 +99,12 @@ static void wlr_libinput_backend_destroy(struct wlr_backend *_backend) {
}
struct wlr_libinput_backend *backend = (struct wlr_libinput_backend *)_backend;
for (size_t i = 0; i < backend->wlr_device_lists->length; i++) {
- struct wlr_list *wlr_devices = backend->wlr_device_lists->items[i];
- for (size_t j = 0; j < wlr_devices->length; j++) {
- struct wlr_input_device *wlr_dev = wlr_devices->items[j];
+ struct wl_list *wlr_devices = backend->wlr_device_lists->items[i];
+ struct wlr_input_device *wlr_dev, *next;
+ wl_list_for_each_safe(wlr_dev, next, wlr_devices, link) {
wl_signal_emit(&backend->backend.events.input_remove, wlr_dev);
wlr_input_device_destroy(wlr_dev);
}
- wlr_list_free(wlr_devices);
}
wlr_list_free(backend->wlr_device_lists);
wl_event_source_remove(backend->input_event);
diff --git a/backend/libinput/events.c b/backend/libinput/events.c
index 053cab02..5da45c67 100644
--- a/backend/libinput/events.c
+++ b/backend/libinput/events.c
@@ -26,6 +26,7 @@ struct wlr_input_device *get_appropriate_device(
static void wlr_libinput_device_destroy(struct wlr_input_device *_dev) {
struct wlr_libinput_input_device *dev = (struct wlr_libinput_input_device *)_dev;
libinput_device_unref(dev->handle);
+ wl_list_remove(&dev->wlr_input_device.link);
free(dev);
}