summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorShane Kearns <ext-shane.2.kearns@nokia.com>2012-02-20 18:48:10 (GMT)
committerQt by Nokia <qt-info@nokia.com>2012-03-07 13:08:57 (GMT)
commit3a57243fbffb771c0991c99d93ac9b9fcf4fc4ee (patch)
treebd9b305c68c5728fa2c926c411fbd38328c7acea /src/network
parentc1a0e58df7f49ef116a843ca58defe6564808098 (diff)
downloadQt-3a57243fbffb771c0991c99d93ac9b9fcf4fc4ee.zip
Qt-3a57243fbffb771c0991c99d93ac9b9fcf4fc4ee.tar.gz
Qt-3a57243fbffb771c0991c99d93ac9b9fcf4fc4ee.tar.bz2
Windows - fix getsockopt calls for narrower than int options
Windows unhelpfully writes to only one byte of the output buffer when getsockopt is called for a boolean option. Therefore we have to zero initialise the int rather than initialising to -1 as was done before. This in general only works for little endian architecture, because the word would look like 0x01000000 on big endian. So I have added some compile time asserts in the assumption that windows is always little endian. This is ok for comparisons with 0/false, but not comparisons with true or nonzero values. Task-number: QTBUG-23488 Change-Id: I3c586d1ada76465fc045a82661f289920c657a4c Reviewed-by: Richard J. Moore <rich@kde.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com> Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com> (cherry picked from commit 46e4a9d5231e2d9e35424259858713ca539b8e30)
Diffstat (limited to 'src/network')
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 6ed0ef4..d4b77a6 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -429,10 +429,14 @@ int QNativeSocketEnginePrivate::option(QNativeSocketEngine::SocketOption opt) co
break;
}
- int v = -1;
+#if Q_BYTE_ORDER != Q_LITTLE_ENDIAN
+#error code assumes windows is little endian
+#endif
+ int v = 0; //note: windows doesn't write to all bytes if the option type is smaller than int
QT_SOCKOPTLEN_T len = sizeof(v);
- if (getsockopt(socketDescriptor, level, n, (char *) &v, &len) != -1)
+ if (getsockopt(socketDescriptor, level, n, (char *) &v, &len) == 0)
return v;
+ WS_ERROR_DEBUG(WSAGetLastError());
return -1;
}