From 3c50917a6ac1ee7fd4707d69a8ca186343c21f91 Mon Sep 17 00:00:00 2001
From: Paul Olav Tvete <paul.tvete@digia.com>
Date: Thu, 16 May 2013 14:28:07 +0200
Subject: [PATCH] Android: Fix crash when using QBackingStore
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When making a QBackingStore for a QWindow that was not created yet,
Qt would try to dereference the (null) platform window pointer.

Task-number: QTBUG-31022
Change-Id: I866c71cce9d401ebb598ea4cc91f7cf9bbb30982
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
---
 .../fbconvenience/qfbbackingstore.cpp               |  5 ++++-
 src/platformsupport/fbconvenience/qfbscreen.cpp     | 13 +++++++++++++
 src/platformsupport/fbconvenience/qfbscreen_p.h     |  4 ++++
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/platformsupport/fbconvenience/qfbbackingstore.cpp b/src/platformsupport/fbconvenience/qfbbackingstore.cpp
index 2a481835e23..b378434ef21 100644
--- a/src/platformsupport/fbconvenience/qfbbackingstore.cpp
+++ b/src/platformsupport/fbconvenience/qfbbackingstore.cpp
@@ -51,7 +51,10 @@ QT_BEGIN_NAMESPACE
 QFbBackingStore::QFbBackingStore(QWindow *window)
     : QPlatformBackingStore(window)
 {
-    (static_cast<QFbWindow *>(window->handle()))->setBackingStore(this);
+    if (window->handle())
+        (static_cast<QFbWindow *>(window->handle()))->setBackingStore(this);
+    else
+        (static_cast<QFbScreen *>(window->screen()->handle()))->addBackingStore(this);
 }
 
 QFbBackingStore::~QFbBackingStore()
diff --git a/src/platformsupport/fbconvenience/qfbscreen.cpp b/src/platformsupport/fbconvenience/qfbscreen.cpp
index 6427b62972c..e5b9f09c146 100644
--- a/src/platformsupport/fbconvenience/qfbscreen.cpp
+++ b/src/platformsupport/fbconvenience/qfbscreen.cpp
@@ -71,6 +71,19 @@ void QFbScreen::initializeCompositor()
 void QFbScreen::addWindow(QFbWindow *window)
 {
     mWindowStack.prepend(window);
+    if (!mBackingStores.isEmpty()) {
+        //check if we have a backing store for this window
+        for (int i = 0; i < mBackingStores.size(); ++i) {
+            QFbBackingStore *bs = mBackingStores.at(i);
+            // this gets called during QWindow::create() at a point where the
+            // invariant (window->handle()->window() == window) is broken
+            if (bs->window() == window->window()) {
+                window->setBackingStore(bs);
+                mBackingStores.removeAt(i);
+                break;
+            }
+        }
+    }
     invalidateRectCache();
     setDirty(window->geometry());
     QWindow *w = topWindow();
diff --git a/src/platformsupport/fbconvenience/qfbscreen_p.h b/src/platformsupport/fbconvenience/qfbscreen_p.h
index c7106358d9e..01a352e96a1 100644
--- a/src/platformsupport/fbconvenience/qfbscreen_p.h
+++ b/src/platformsupport/fbconvenience/qfbscreen_p.h
@@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE
 class QFbWindow;
 class QFbCursor;
 class QPainter;
+class QFbBackingStore;
 
 class QFbScreen : public QObject, public QPlatformScreen
 {
@@ -74,6 +75,8 @@ public:
     virtual void lower(QFbWindow *window);
     virtual void topWindowChanged(QWindow *) {}
 
+    void addBackingStore(QFbBackingStore *bs) {mBackingStores << bs;}
+
 public slots:
     virtual void setDirty(const QRect &rect);
     void setPhysicalSize(const QSize &size);
@@ -102,6 +105,7 @@ private:
 
     QPainter *mCompositePainter;
     QList<QPair<QRect, int> > mCachedRects;
+    QList <QFbBackingStore*> mBackingStores;
 
     friend class QFbWindow;
     bool mIsUpToDate;
-- 
GitLab