From 48091975969fa5a7c436f4f51a96f26f6297af6e Mon Sep 17 00:00:00 2001
From: Giulio Camuffo <giulio.camuffo@jollamobile.com>
Date: Thu, 11 Dec 2014 11:46:14 +0200
Subject: [PATCH] Fix dangling pointer access when getting dnd data in some
 cases

Calling wl_data_source.destroy(); wl_data_offer.receive(), where the
wl_data_offer is referring to the destroyed wl_data_source, was crashing
the compositor.

Change-Id: Iab352d63f8a93aebd0bfbcf1dc26c0e8a48a523a
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
---
 src/compositor/wayland_wrapper/qwldataoffer_p.h  | 3 ++-
 src/compositor/wayland_wrapper/qwldatasource_p.h | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/compositor/wayland_wrapper/qwldataoffer_p.h b/src/compositor/wayland_wrapper/qwldataoffer_p.h
index 5911819d8..643322f32 100644
--- a/src/compositor/wayland_wrapper/qwldataoffer_p.h
+++ b/src/compositor/wayland_wrapper/qwldataoffer_p.h
@@ -41,6 +41,7 @@
 #ifndef WLDATAOFFER_H
 #define WLDATAOFFER_H
 
+#include <QPointer>
 #include <QtCompositor/private/qwayland-server-wayland.h>
 
 QT_BEGIN_NAMESPACE
@@ -63,7 +64,7 @@ protected:
     void data_offer_destroy_resource(Resource *resource) Q_DECL_OVERRIDE;
 
 private:
-    DataSource *m_dataSource;
+    QPointer<DataSource> m_dataSource;
 };
 
 }
diff --git a/src/compositor/wayland_wrapper/qwldatasource_p.h b/src/compositor/wayland_wrapper/qwldatasource_p.h
index 01ac4cbd9..013f4b54f 100644
--- a/src/compositor/wayland_wrapper/qwldatasource_p.h
+++ b/src/compositor/wayland_wrapper/qwldatasource_p.h
@@ -42,7 +42,7 @@
 #define WLDATASOURCE_H
 
 #include <QtCompositor/private/qwayland-server-wayland.h>
-
+#include <QObject>
 #include <QtCore/QList>
 
 QT_BEGIN_NAMESPACE
@@ -53,7 +53,7 @@ class DataOffer;
 class DataDevice;
 class DataDeviceManager;
 
-class DataSource : public QtWaylandServer::wl_data_source
+class DataSource : public QObject, public QtWaylandServer::wl_data_source
 {
 public:
     DataSource(struct wl_client *client, uint32_t id, uint32_t time);
-- 
GitLab