From 3808b5df167aeb16f8fb64f54a3b87e29c5b7189 Mon Sep 17 00:00:00 2001 From: Couchy Date: Fri, 3 Aug 2018 23:20:01 -0400 Subject: [PATCH] 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. --- src/base/bittorrent/torrentinfo.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/base/bittorrent/torrentinfo.cpp b/src/base/bittorrent/torrentinfo.cpp index 84454683d..a47501b03 100644 --- a/src/base/bittorrent/torrentinfo.cpp +++ b/src/base/bittorrent/torrentinfo.cpp @@ -112,10 +112,18 @@ TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString *error) noexc 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 (error) - *error = tr("Torrent file read error"); + *error = tr("Torrent file read error: size mismatch"); return TorrentInfo(); }