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>
This commit is contained in:
Edward Welbourne 2016-05-02 11:02:09 +02:00 committed by The Qt Project
parent 73df18e161
commit e6b1e918e1

View File

@ -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;