QNetwork[http]: Discard or ignore corrupted cache entries

In an attempt to avoid situations like the linked bug-report from
happening again, discard cached entries with no headers and ignore
entries where the payload is smaller than what the header specified (if
it specified anything).

In a future revision we might want to add a length to the cache's
metadata, potentially with a checksum trailing the content.

Task-number: QTBUG-111397
Pick-to: 6.5 6.4 6.2
Change-Id: Ie40149ffdaff7886bcd44cbd45605bdb7918e105
Reviewed-by: Konrad Kujawa <konrad.kujawa@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
bb10
Mårten Nordheim 2023-03-03 19:08:23 +01:00
parent e5f295c8a4
commit a6776de0c7
2 changed files with 7 additions and 1 deletions

View File

@ -677,7 +677,7 @@ bool QCacheItem::read(QFileDevice *device, bool readData)
if (!device->fileName().endsWith(expectedFilename))
return false;
return metaData.isValid();
return metaData.isValid() && !metaData.rawHeaders().isEmpty();
}
QT_END_NAMESPACE

View File

@ -501,6 +501,12 @@ bool QNetworkReplyHttpImplPrivate::loadFromCacheIfAllowed(QHttpNetworkRequest &h
QNetworkHeadersPrivate::RawHeadersList::ConstIterator it;
cacheHeaders.setAllRawHeaders(metaData.rawHeaders());
it = cacheHeaders.findRawHeader("content-length");
if (it != cacheHeaders.rawHeaders.constEnd()) {
if (nc->data(httpRequest.url())->size() < it->second.toLongLong())
return false; // The data is smaller than the content-length specified
}
it = cacheHeaders.findRawHeader("etag");
if (it != cacheHeaders.rawHeaders.constEnd())
httpRequest.setHeaderField("If-None-Match", it->second);