fix: define default_resume_flags sentinel, clearing open_enable_fallocate

Replace the raw ~uint32_t sentinel with a named constant
Download::default_resume_flags that masks out the open_enable_fallocate
bit. This prevents flag_fallocate from being set on all files when
open_throw() reads resume_flags() before explicit flags are configured.

The sentinel value (~uint32_t & ~open_enable_fallocate) retains the
full range as a 'not set' marker while being safe to pass through
Download::open() without unintended fallocate.
This commit is contained in:
trim21
2026-06-08 00:30:10 +08:00
committed by Jari Sundell
parent e96f594afc
commit 72f2197add
2 changed files with 9 additions and 7 deletions
+3 -1
View File
@@ -22,6 +22,8 @@ public:
typedef torrent::ConnectionList connection_list_type; typedef torrent::ConnectionList connection_list_type;
typedef download_type::ConnectionType connection_type; typedef download_type::ConnectionType connection_type;
static constexpr uint32_t default_resume_flags = ~uint32_t{} & ~torrent::Download::open_enable_fallocate;
static const int variable_hashing_stopped = 0; static const int variable_hashing_stopped = 0;
static const int variable_hashing_initial = 1; static const int variable_hashing_initial = 1;
static const int variable_hashing_last = 2; static const int variable_hashing_last = 2;
@@ -100,7 +102,7 @@ private:
download_type m_download; download_type m_download;
bool m_hashFailed{}; bool m_hashFailed{};
std::string m_message; std::string m_message;
uint32_t m_resumeFlags{~uint32_t{}}; uint32_t m_resumeFlags{default_resume_flags};
unsigned int m_group{}; unsigned int m_group{};
}; };
+6 -6
View File
@@ -331,7 +331,7 @@ DownloadList::resume(Download* download, int flags) {
// We need to make sure the flags aren't reset if someone decideds // We need to make sure the flags aren't reset if someone decideds
// to call resume() while it is hashing, etc. // to call resume() while it is hashing, etc.
if (download->resume_flags() == ~uint32_t()) if (download->resume_flags() == Download::default_resume_flags)
download->set_resume_flags(flags); download->set_resume_flags(flags);
// Manual or end-of-download rehashing clears the resume data so // Manual or end-of-download rehashing clears the resume data so
@@ -404,7 +404,7 @@ DownloadList::resume(Download* download, int flags) {
download->set_priority(download->priority()); download->set_priority(download->priority());
download->download()->start(download->resume_flags()); download->download()->start(download->resume_flags());
download->set_resume_flags(~uint32_t()); download->set_resume_flags(Download::default_resume_flags);
DL_TRIGGER_EVENT(download, "event.download.resumed"); DL_TRIGGER_EVENT(download, "event.download.resumed");
@@ -421,7 +421,7 @@ DownloadList::pause(Download* download, int flags) {
try { try {
download->set_resume_flags(~uint32_t()); download->set_resume_flags(Download::default_resume_flags);
rpc::parse_command_single(rpc::make_target(download), "view.set_not_visible=active"); rpc::parse_command_single(rpc::make_target(download), "view.set_not_visible=active");
@@ -660,8 +660,8 @@ DownloadList::confirm_finished(Download* download) {
if (find(infohash) == end()) if (find(infohash) == end())
return; return;
// if (download->resume_flags() != ~uint32_t()) // if (download->resume_flags() != Download::default_resume_flags)
// throw torrent::internal_error("DownloadList::confirm_finished(...) download->resume_flags() != ~uint32_t()."); // throw torrent::internal_error("DownloadList::confirm_finished(...) download->resume_flags() != Download::default_resume_flags.");
// See #1292. // See #1292.
// //
@@ -671,7 +671,7 @@ DownloadList::confirm_finished(Download* download) {
// //
// TODO: Add a check when setting the flags to see if the torrent is // TODO: Add a check when setting the flags to see if the torrent is
// being hashed. // being hashed.
download->set_resume_flags(~uint32_t()); download->set_resume_flags(Download::default_resume_flags);
if (!download->is_active() && rpc::call_command_value("d.state", rpc::make_target(download)) == 1) if (!download->is_active() && rpc::call_command_value("d.state", rpc::make_target(download)) == 1)
resume(download, resume(download,