Browse Source

Avoid allocating large memory when loading a .torrent file

`QIODevice::read(qint64 maxSize)` will allocate full `maxSize` of memory no matter
what the real file size was, this caused users to experience out-of-memory
exception on 32-bit qbt.
Also handle the OOM execption if it still fails.

Closes #9064, #9075, #9130, #9239, #9246, #9279.
adaptive-webui-19844
Couchy 6 years ago committed by Chocobo1
parent
commit
3808b5df16
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
  1. 12
      src/base/bittorrent/torrentinfo.cpp

12
src/base/bittorrent/torrentinfo.cpp

@ -112,10 +112,18 @@ TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString *error) noexc
return TorrentInfo(); return TorrentInfo();
} }
const QByteArray data = file.read(fileSizeLimit); QByteArray data;
try {
data = file.readAll();
}
catch (const std::bad_alloc &e) {
if (error)
*error = tr("Torrent file read error: %1").arg(e.what());
return TorrentInfo();
}
if (data.size() != file.size()) { if (data.size() != file.size()) {
if (error) if (error)
*error = tr("Torrent file read error"); *error = tr("Torrent file read error: size mismatch");
return TorrentInfo(); return TorrentInfo();
} }

Loading…
Cancel
Save