summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2016-03-11 14:59:19 +0100
committerMarc Mutz <marc.mutz@kdab.com>2016-03-12 19:04:14 +0000
commit978804d2c229e1b15b497cb8de18032d1e220529 (patch)
tree58c47ae40cef48400d5d0745f48195b72bd2e38c /src/network
parent514c202da95bbe876c9759961a8032eae4b96bdd (diff)
QNetworkHeaders: fix UB (invalid enum value) in Private::parseAndSetHeader()
Found by UBSan: qnetworkrequest.cpp:1016:19: runtime error: load of value 4294967295, which is not a valid value for type 'KnownHeaders' KnownHeaders does not contain a failure state, and no negative values. -1 is therefore not a valid value for an object of type KnownHeaders, so loading one is considered UB. Fix by returning the result of parseHeaderName() as an int, only casting to KnownHeaders after checking for the failure case. Change-Id: I6b165fe2b15c747344a9b2750bb753582c5bcbeb Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qnetworkrequest.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/network/access/qnetworkrequest.cpp b/src/network/access/qnetworkrequest.cpp
index 558e015ae4..f5010198f3 100644
--- a/src/network/access/qnetworkrequest.cpp
+++ b/src/network/access/qnetworkrequest.cpp
@@ -798,10 +798,10 @@ static QByteArray headerValue(QNetworkRequest::KnownHeaders header, const QVaria
return QByteArray();
}
-static QNetworkRequest::KnownHeaders parseHeaderName(const QByteArray &headerName)
+static int parseHeaderName(const QByteArray &headerName)
{
if (headerName.isEmpty())
- return QNetworkRequest::KnownHeaders(-1);
+ return -1;
switch (tolower(headerName.at(0))) {
case 'c':
@@ -833,7 +833,7 @@ static QNetworkRequest::KnownHeaders parseHeaderName(const QByteArray &headerNam
break;
}
- return QNetworkRequest::KnownHeaders(-1); // nothing found
+ return -1; // nothing found
}
static QVariant parseHttpDate(const QByteArray &raw)
@@ -1005,8 +1005,10 @@ void QNetworkHeadersPrivate::setRawHeaderInternal(const QByteArray &key, const Q
void QNetworkHeadersPrivate::parseAndSetHeader(const QByteArray &key, const QByteArray &value)
{
// is it a known header?
- QNetworkRequest::KnownHeaders parsedKey = parseHeaderName(key);
- if (parsedKey != QNetworkRequest::KnownHeaders(-1)) {
+ const int parsedKeyAsInt = parseHeaderName(key);
+ if (parsedKeyAsInt != -1) {
+ const QNetworkRequest::KnownHeaders parsedKey
+ = static_cast<QNetworkRequest::KnownHeaders>(parsedKeyAsInt);
if (value.isNull()) {
cookedHeaders.remove(parsedKey);
} else if (parsedKey == QNetworkRequest::ContentLengthHeader