From e6b1e918e12df25a359fbb87ae26f584d46df823 Mon Sep 17 00:00:00 2001
From: Edward Welbourne <edward.welbourne@theqtcompany.com>
Date: Mon, 2 May 2016 11:02:09 +0200
Subject: [PATCH] QLinuxFbScreen: fix uninitialized member warnings

Prompted by Coverity CID 11720 (allegedly recently new in dev but
long-standing in 5.6).  Even assuming the class is used correctly -
test initialize() and only use if that succeeded - the destructor
would have passed uninitialized arguments to munmap() and ioctl().

Noticed a double close along the way: it's been fixed on dev but
should have been fixed in 5.6, too.  Documented why ioctl() failure in
switchToGraphicsMode() should at least do no harm.

Change-Id: Ie26a9eefa435b5ff5b1a02e03e29469b8db72d3c
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
---
 .../platforms/linuxfb/qlinuxfbscreen.cpp      | 30 ++++++++-----------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
index 91708c0a476..8c3e73fd808 100644
--- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
+++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
@@ -256,15 +256,15 @@ static int openTtyDevice(const QString &device)
     return fd;
 }
 
-static bool switchToGraphicsMode(int ttyfd, int *oldMode)
+static void switchToGraphicsMode(int ttyfd, bool doSwitch, int *oldMode)
 {
-    ioctl(ttyfd, KDGETMODE, oldMode);
-    if (*oldMode != KD_GRAPHICS) {
-       if (ioctl(ttyfd, KDSETMODE, KD_GRAPHICS) != 0)
-            return false;
+    // Do not warn if the switch fails: the ioctl fails when launching from a
+    // remote console and there is nothing we can do about it.  The matching
+    // call in resetTty should at least fail then, too, so we do no harm.
+    if (ioctl(ttyfd, KDGETMODE, oldMode) == 0) {
+        if (doSwitch && *oldMode != KD_GRAPHICS)
+            ioctl(ttyfd, KDSETMODE, KD_GRAPHICS);
     }
-
-    return true;
 }
 
 static void resetTty(int ttyfd, int oldMode)
@@ -280,21 +280,21 @@ static void blankScreen(int fd, bool on)
 }
 
 QLinuxFbScreen::QLinuxFbScreen(const QStringList &args)
-    : mArgs(args), mFbFd(-1), mBlitter(0)
+    : mArgs(args), mFbFd(-1), mTtyFd(-1), mBlitter(0)
 {
+    mMmap.data = 0;
 }
 
 QLinuxFbScreen::~QLinuxFbScreen()
 {
     if (mFbFd != -1) {
-        munmap(mMmap.data - mMmap.offset, mMmap.size);
+        if (mMmap.data)
+            munmap(mMmap.data - mMmap.offset, mMmap.size);
         close(mFbFd);
     }
 
-    if (mTtyFd != -1) {
+    if (mTtyFd != -1)
         resetTty(mTtyFd, mOldTtyMode);
-        close(mTtyFd);
-    }
 
     delete mBlitter;
 }
@@ -389,11 +389,7 @@ bool QLinuxFbScreen::initialize()
     if (mTtyFd == -1)
         qErrnoWarning(errno, "Failed to open tty");
 
-    if (doSwitchToGraphicsMode)
-        switchToGraphicsMode(mTtyFd, &mOldTtyMode);
-        // Do not warn if the switch fails: the ioctl fails when launching from
-        // a remote console and there is nothing we can do about it.
-
+    switchToGraphicsMode(mTtyFd, doSwitchToGraphicsMode, &mOldTtyMode);
     blankScreen(mFbFd, false);
 
     return true;
-- 
GitLab