mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-10 16:19:23 +00:00
Fix resource leaks and minor issues
- Close pipe fds on fork failure in ExecFile::execute - Add exception-safe fclose in cmd_file_append via try/catch - Add overflow guards before K/M/G bit shifts in parse_whole_value - Fix %u format for int* in sscanf (change to %d) - Fix typo "atter"→"after" in error message
This commit is contained in:
@@ -173,9 +173,13 @@ cmd_file_append(const torrent::Object::list_type& args) {
|
|||||||
if (output == nullptr)
|
if (output == nullptr)
|
||||||
throw torrent::input_error("Could not append to file '" + args.front().as_string() + "': " + std::strerror(errno));
|
throw torrent::input_error("Could not append to file '" + args.front().as_string() + "': " + std::strerror(errno));
|
||||||
|
|
||||||
file_print_list(++args.begin(), args.end(), output, file_print_delim_space);
|
try {
|
||||||
|
file_print_list(++args.begin(), args.end(), output, file_print_delim_space);
|
||||||
fprintf(output, "\n");
|
fprintf(output, "\n");
|
||||||
|
} catch (...) {
|
||||||
|
fclose(output);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
fclose(output);
|
fclose(output);
|
||||||
return torrent::Object();
|
return torrent::Object();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ Download::set_root_directory(const std::string& path) {
|
|||||||
rpc::call_command("d.state.set", (int64_t)0, rpc::make_target(this));
|
rpc::call_command("d.state.set", (int64_t)0, rpc::make_target(this));
|
||||||
control->core()->download_list()->close_directly(this);
|
control->core()->download_list()->close_directly(this);
|
||||||
|
|
||||||
throw torrent::input_error("Cannot change the directory of an open download atter the files have been moved.");
|
throw torrent::input_error("Cannot change the directory of an open download after the files have been moved.");
|
||||||
}
|
}
|
||||||
|
|
||||||
control->core()->download_list()->close_directly(this);
|
control->core()->download_list()->close_directly(this);
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ void
|
|||||||
OptionParser::call_int_pair(slot_int_pair slot, const std::string& arg) {
|
OptionParser::call_int_pair(slot_int_pair slot, const std::string& arg) {
|
||||||
int a, b;
|
int a, b;
|
||||||
|
|
||||||
if (std::sscanf(arg.c_str(), "%u-%u", &a, &b) != 2)
|
if (std::sscanf(arg.c_str(), "%d-%d", &a, &b) != 2)
|
||||||
throw std::runtime_error("Invalid argument, \"" + arg + "\" should be \"a-b\"");
|
throw std::runtime_error("Invalid argument, \"" + arg + "\" should be \"a-b\"");
|
||||||
|
|
||||||
slot(a, b);
|
slot(a, b);
|
||||||
|
|||||||
@@ -41,8 +41,13 @@ ExecFile::execute(const char* file, char* const* argv, int flags) {
|
|||||||
|
|
||||||
pid_t childPid = fork();
|
pid_t childPid = fork();
|
||||||
|
|
||||||
if (childPid == -1)
|
if (childPid == -1) {
|
||||||
|
if (flags & flag_capture) {
|
||||||
|
::close(pipeFd[0]);
|
||||||
|
::close(pipeFd[1]);
|
||||||
|
}
|
||||||
throw torrent::input_error("ExecFile::execute(...) Fork failed.");
|
throw torrent::input_error("ExecFile::execute(...) Fork failed.");
|
||||||
|
}
|
||||||
|
|
||||||
if (childPid == 0) {
|
if (childPid == 0) {
|
||||||
if (flags & flag_background) {
|
if (flags & flag_background) {
|
||||||
|
|||||||
+9
-3
@@ -120,11 +120,17 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
|||||||
case 'b':
|
case 'b':
|
||||||
case 'B': ++last; break;
|
case 'B': ++last; break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'K': *value = *value << 10; ++last; break;
|
case 'K':
|
||||||
|
if (*value > (int64_t)0x1FFFFFFFFFFFFF) return src; // overflow guard
|
||||||
|
*value = *value << 10; ++last; break;
|
||||||
case 'm':
|
case 'm':
|
||||||
case 'M': *value = *value << 20; ++last; break;
|
case 'M':
|
||||||
|
if (*value > (int64_t)0x7FFFFFFFFFF) return src; // overflow guard
|
||||||
|
*value = *value << 20; ++last; break;
|
||||||
case 'g':
|
case 'g':
|
||||||
case 'G': *value = *value << 30; ++last; break;
|
case 'G':
|
||||||
|
if (*value > (int64_t)0x1FFFFFFFF) return src; // overflow guard
|
||||||
|
*value = *value << 30; ++last; break;
|
||||||
// case ' ':
|
// case ' ':
|
||||||
// case '\0': *value = *value * unit; break;
|
// case '\0': *value = *value * unit; break;
|
||||||
// default: throw torrent::input_error("Could not parse value.");
|
// default: throw torrent::input_error("Could not parse value.");
|
||||||
|
|||||||
Reference in New Issue
Block a user