From f6d4585b382cf8916b4d78efb9651853cfc63217 Mon Sep 17 00:00:00 2001 From: Yat Ho Date: Sat, 17 Jan 2026 07:56:02 +0800 Subject: [PATCH] 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 --- utils/remote.cc | 71 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/utils/remote.cc b/utils/remote.cc index 07d62697a..8aa326843 100644 --- a/utils/remote.cc +++ b/utils/remote.cc @@ -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(optarg_sv).value()); - args.insert_or_assign(TR_KEY_seed_ratio_limited, true); + if (auto const val = tr_num_parse(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(optarg_sv).value()); - args.insert_or_assign(TR_KEY_idle_seeding_limit_enabled, true); + if (auto const val = tr_num_parse(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(optarg_sv)) { - targs->insert_or_assign(TR_KEY_peer_limit, tr_num_parse(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(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(optarg_sv)) { auto* list = args.find_if(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(); } - list->emplace_back(tr_num_parse(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(optarg_sv).value()); - args.insert_or_assign(TR_KEY_seed_ratio_mode, TR_RATIOLIMIT_SINGLE); + if (auto const val = tr_num_parse(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(optarg_sv).value()); - args.insert_or_assign(TR_KEY_seed_idle_mode, TR_IDLELIMIT_SINGLE); + if (auto const val = tr_num_parse(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: