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>bb10
parent
514c202da9
commit
978804d2c2
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue