fix(remote): crash when number argument is invalid (#8156)

* fix: crash when `--global-seedratio` argument is invalid

* fix: crash when `--global-idle-seeding-limit` argument is invalid

* fix: crash when `--peers` argument is invalid

* fix: crash when `--tracker-remove` argument is invalid

* fix: crash when `--seedratio` argument is invalid

* fix: crash when `--idle-seeding-limit` argument is invalid
This commit is contained in:
Yat Ho
2026-01-17 07:56:02 +08:00
committed by GitHub
parent 4e03de7630
commit f6d4585b38

View File

@@ -2954,8 +2954,16 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
break;
case 953:
args.insert_or_assign(TR_KEY_seed_ratio_limit, tr_num_parse<double>(optarg_sv).value());
args.insert_or_assign(TR_KEY_seed_ratio_limited, true);
if (auto const val = tr_num_parse<double>(optarg_sv))
{
args.insert_or_assign(TR_KEY_seed_ratio_limit, *val);
args.insert_or_assign(TR_KEY_seed_ratio_limited, true);
}
else
{
fmt::print(stderr, "Argument to '-gsr'/'--global-seedratio' should be a number");
status |= EXIT_FAILURE;
}
break;
case 954:
@@ -2963,8 +2971,16 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
break;
case 958:
args.insert_or_assign(TR_KEY_idle_seeding_limit, tr_num_parse<int64_t>(optarg_sv).value());
args.insert_or_assign(TR_KEY_idle_seeding_limit_enabled, true);
if (auto const val = tr_num_parse<int64_t>(optarg_sv))
{
args.insert_or_assign(TR_KEY_idle_seeding_limit, *val);
args.insert_or_assign(TR_KEY_idle_seeding_limit_enabled, true);
}
else
{
fmt::print(stderr, "Argument to '-gisl'/'--global-idle-seeding-limit' should be an integer");
status |= EXIT_FAILURE;
}
break;
case 959:
@@ -3061,15 +3077,22 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
break;
case 930:
if (targs != nullptr)
if (auto const val = tr_num_parse<int64_t>(optarg_sv))
{
targs->insert_or_assign(TR_KEY_peer_limit, tr_num_parse<int64_t>(optarg_sv).value());
if (targs != nullptr)
{
targs->insert_or_assign(TR_KEY_peer_limit, *val);
}
else
{
sargs->insert_or_assign(TR_KEY_peer_limit_global, *val);
}
}
else
{
sargs->insert_or_assign(TR_KEY_peer_limit_global, tr_num_parse<int64_t>(optarg_sv).value());
fmt::print(stderr, "Argument to '-pr'/'--peers' should be an integer");
status |= EXIT_FAILURE;
}
break;
default:
@@ -3084,6 +3107,7 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
switch (c)
{
case 712:
if (auto const val = tr_num_parse<int64_t>(optarg_sv))
{
auto* list = args.find_if<tr_variant::Vector>(TR_KEY_tracker_remove);
if (list == nullptr)
@@ -3091,13 +3115,26 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
list = args.insert_or_assign(TR_KEY_tracker_remove, tr_variant::make_vector(1))
.first.get_if<tr_variant::Vector>();
}
list->emplace_back(tr_num_parse<int64_t>(optarg_sv).value());
list->emplace_back(*val);
}
else
{
fmt::print(stderr, "Argument to '-tr'/'--tracker-remove' should be an integer");
status |= EXIT_FAILURE;
}
break;
case 950:
args.insert_or_assign(TR_KEY_seed_ratio_limit, tr_num_parse<double>(optarg_sv).value());
args.insert_or_assign(TR_KEY_seed_ratio_mode, TR_RATIOLIMIT_SINGLE);
if (auto const val = tr_num_parse<double>(optarg_sv))
{
args.insert_or_assign(TR_KEY_seed_ratio_limit, *val);
args.insert_or_assign(TR_KEY_seed_ratio_mode, TR_RATIOLIMIT_SINGLE);
}
else
{
fmt::print(stderr, "Argument to '-sr'/'--seedratio' should be a number");
status |= EXIT_FAILURE;
}
break;
case 951:
@@ -3109,8 +3146,16 @@ int process_args(char const* rpcurl, int argc, char const* const* argv, RemoteCo
break;
case 955:
args.insert_or_assign(TR_KEY_seed_idle_limit, tr_num_parse<int64_t>(optarg_sv).value());
args.insert_or_assign(TR_KEY_seed_idle_mode, TR_IDLELIMIT_SINGLE);
if (auto const val = tr_num_parse<int64_t>(optarg_sv))
{
args.insert_or_assign(TR_KEY_seed_idle_limit, *val);
args.insert_or_assign(TR_KEY_seed_idle_mode, TR_IDLELIMIT_SINGLE);
}
else
{
fmt::print(stderr, "Argument to '-isl'/'--idle-seeding-limit' should be an integer");
status |= EXIT_FAILURE;
}
break;
case 956: