mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-05 05:39:22 +00:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c0535b1fa | |||
| d59765fda4 | |||
| 66c49d24e5 | |||
| 3af0410a6e | |||
| 3c94b03323 | |||
| c5d54fbb97 | |||
| 44d51171e1 | |||
| dc916278c2 | |||
| 366b936ded | |||
| 8bcc4c6e92 | |||
| 5421a35349 | |||
| d5ce0984fc | |||
| a89ce3cd7b | |||
| d98a441dc4 | |||
| fc6e57c3fa | |||
| 8e23ba8b17 | |||
| e656801cfa | |||
| 9f6fd7994e | |||
| bb77aa644c | |||
| 83a5e7687b | |||
| 910b9b35fc | |||
| e3051df78c | |||
| 21287a1355 | |||
| 6471dc181e | |||
| a5c39566c8 | |||
| 019c16a077 | |||
| 439d23ce62 | |||
| 83b03c2c1e |
@@ -86,8 +86,10 @@ initialize_command_system() {
|
|||||||
CMD_VAR_VALUE ("system.file.split_size", -1);
|
CMD_VAR_VALUE ("system.file.split_size", -1);
|
||||||
CMD_VAR_STRING ("system.file.split_suffix", ".part");
|
CMD_VAR_STRING ("system.file.split_suffix", ".part");
|
||||||
|
|
||||||
CMD_ANY ("system.file_name.replace_slash", [](auto, auto) { return torrent::runtime::client_config()->file_name_replace_slash(); });
|
CMD_ANY ("system.file_name.replace_slash", [](auto, auto) { return torrent::runtime::client_config()->file_name_replace_slash(); });
|
||||||
CMD_ANY_STRING_V("system.file_name.replace_slash.set", [](auto, auto& str) { return torrent::runtime::client_config()->set_file_name_replace_slash(str); });
|
CMD_ANY_STRING_V("system.file_name.replace_slash.set", [](auto, auto& str) { return torrent::runtime::client_config()->set_file_name_replace_slash(str); });
|
||||||
|
CMD_ANY ("system.file_name.allow_legacy_utf8", [](auto, auto) { return torrent::runtime::client_config()->file_name_allow_legacy_utf8(); });
|
||||||
|
CMD_ANY_VALUE_V ("system.file_name.allow_legacy_utf8.set", [](auto, auto& value) { return torrent::runtime::client_config()->set_file_name_allow_legacy_utf8(value); });
|
||||||
|
|
||||||
CMD_ANY ("system.file_status_cache.size", [](auto, auto) { return control->core()->file_status_cache()->size(); });
|
CMD_ANY ("system.file_status_cache.size", [](auto, auto) { return control->core()->file_status_cache()->size(); });
|
||||||
CMD_ANY_V ("system.file_status_cache.prune", [](auto, auto) { return control->core()->file_status_cache()->prune(); });
|
CMD_ANY_V ("system.file_status_cache.prune", [](auto, auto) { return control->core()->file_status_cache()->prune(); });
|
||||||
@@ -167,10 +169,13 @@ initialize_command_system() {
|
|||||||
rpc::rpc.mark_safe("system.time");
|
rpc::rpc.mark_safe("system.time");
|
||||||
rpc::rpc.mark_safe("system.time_seconds");
|
rpc::rpc.mark_safe("system.time_seconds");
|
||||||
rpc::rpc.mark_safe("system.time_usec");
|
rpc::rpc.mark_safe("system.time_usec");
|
||||||
|
rpc::rpc.mark_safe("system.torrent_name.use_sanitized");
|
||||||
rpc::rpc.mark_safe("system.file.allocate");
|
rpc::rpc.mark_safe("system.file.allocate");
|
||||||
rpc::rpc.mark_safe("system.file.max_size");
|
rpc::rpc.mark_safe("system.file.max_size");
|
||||||
rpc::rpc.mark_safe("system.file.split_size");
|
rpc::rpc.mark_safe("system.file.split_size");
|
||||||
rpc::rpc.mark_safe("system.file.split_suffix");
|
rpc::rpc.mark_safe("system.file.split_suffix");
|
||||||
|
rpc::rpc.mark_safe("system.file_name.replace_slash");
|
||||||
|
rpc::rpc.mark_safe("system.file_name.allow_legacy_utf8");
|
||||||
|
|
||||||
rpc::rpc.mark_safe("system.sockets.size");
|
rpc::rpc.mark_safe("system.sockets.size");
|
||||||
rpc::rpc.mark_safe("system.sockets.max_size");
|
rpc::rpc.mark_safe("system.sockets.max_size");
|
||||||
|
|||||||
+1
-1
@@ -108,7 +108,7 @@ public:
|
|||||||
|
|
||||||
static stack_type* from_data(char* data) { return reinterpret_cast<stack_type*>(data); }
|
static stack_type* from_data(char* data) { return reinterpret_cast<stack_type*>(data); }
|
||||||
|
|
||||||
char buffer[sizeof(torrent::Object) * max_arguments];
|
alignas(optimal_alignment) char buffer[sizeof(torrent::Object) * max_arguments];
|
||||||
};
|
};
|
||||||
|
|
||||||
command_base() : m_copy_helper(nullptr), m_dest_helper(nullptr) {}
|
command_base() : m_copy_helper(nullptr), m_dest_helper(nullptr) {}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "rpc/exec_file.h"
|
#include "rpc/exec_file.h"
|
||||||
|
|
||||||
// #include <cassert>
|
// #include <cassert>
|
||||||
@@ -81,8 +83,9 @@ ExecFile::execute_object(const torrent::Object& rawArgs, int flags) {
|
|||||||
char* argsBuffer[max_args];
|
char* argsBuffer[max_args];
|
||||||
char** argsCurrent = argsBuffer;
|
char** argsCurrent = argsBuffer;
|
||||||
|
|
||||||
// Size of value strings are less than 24.
|
// On the heap: a buffer of buffer_size does not belong on the stack of whichever thread runs the command.
|
||||||
char valueBuffer[buffer_size+1];
|
auto valueStorage = std::make_unique<char[]>(buffer_size + 1);
|
||||||
|
char* valueBuffer = valueStorage.get();
|
||||||
char* valueCurrent = valueBuffer;
|
char* valueCurrent = valueBuffer;
|
||||||
|
|
||||||
if (rawArgs.is_list()) {
|
if (rawArgs.is_list()) {
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ namespace rpc {
|
|||||||
class ExecFile {
|
class ExecFile {
|
||||||
public:
|
public:
|
||||||
static constexpr unsigned int max_args = 128;
|
static constexpr unsigned int max_args = 128;
|
||||||
static constexpr unsigned int buffer_size = 4096;
|
static constexpr unsigned int buffer_size = 128 * 1024;
|
||||||
|
|
||||||
static constexpr int flag_expand_tilde = 0x1;
|
static constexpr int flag_expand_tilde = 0x1;
|
||||||
static constexpr int flag_throw = 0x2;
|
static constexpr int flag_throw = 0x2;
|
||||||
|
|||||||
+14
-9
@@ -118,27 +118,32 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
|||||||
if (base != 0 && base != 8 && base != 10 && base != 16)
|
if (base != 0 && base != 8 && base != 10 && base != 16)
|
||||||
throw torrent::input_error("Command::string_to_value_unit(...) received invalid base.");
|
throw torrent::input_error("Command::string_to_value_unit(...) received invalid base.");
|
||||||
|
|
||||||
|
const char* first = src;
|
||||||
|
|
||||||
while (parse_is_space(*src))
|
while (parse_is_space(*src))
|
||||||
src++;
|
src++;
|
||||||
|
|
||||||
if (src[0] == '+')
|
if (src[0] == '+')
|
||||||
return src;
|
return first;
|
||||||
|
|
||||||
if (src[0] == '-') {
|
if (src[0] == '-') {
|
||||||
if (base == 8 || base == 16)
|
if (base == 8 || base == 16)
|
||||||
return src;
|
return first;
|
||||||
|
|
||||||
if (src[1] == '0')
|
if (src[1] == '0')
|
||||||
return src;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (base == 10 && src[0] == '0' && (src[1] >= '0' && src[1] <= '9'))
|
||||||
|
return first;
|
||||||
|
|
||||||
char* last{};
|
char* last{};
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
*value = strtoll(src, &last, base);
|
*value = strtoll(src, &last, base);
|
||||||
|
|
||||||
if (errno == ERANGE)
|
if (errno == ERANGE)
|
||||||
return src;
|
return first;
|
||||||
|
|
||||||
if (last == src) {
|
if (last == src) {
|
||||||
*value = 0;
|
*value = 0;
|
||||||
@@ -148,7 +153,7 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
|||||||
if (strcasecmp(src, "true") == 0) { *value = 1; return src + strlen("true"); }
|
if (strcasecmp(src, "true") == 0) { *value = 1; return src + strlen("true"); }
|
||||||
if (strcasecmp(src, "false") == 0) { *value = 0; return src + strlen("false"); }
|
if (strcasecmp(src, "false") == 0) { *value = 0; return src + strlen("false"); }
|
||||||
|
|
||||||
return src;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (*last) {
|
switch (*last) {
|
||||||
@@ -156,15 +161,15 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
|||||||
case 'B': ++last; break;
|
case 'B': ++last; break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'K':
|
case 'K':
|
||||||
if (!value_fits_shifted(*value, 10)) return src; // overflow guard
|
if (!value_fits_shifted(*value, 10)) return first; // overflow guard
|
||||||
*value = *value << 10; ++last; break;
|
*value = *value << 10; ++last; break;
|
||||||
case 'm':
|
case 'm':
|
||||||
case 'M':
|
case 'M':
|
||||||
if (!value_fits_shifted(*value, 20)) return src; // overflow guard
|
if (!value_fits_shifted(*value, 20)) return first; // overflow guard
|
||||||
*value = *value << 20; ++last; break;
|
*value = *value << 20; ++last; break;
|
||||||
case 'g':
|
case 'g':
|
||||||
case 'G':
|
case 'G':
|
||||||
if (!value_fits_shifted(*value, 30)) return src; // overflow guard
|
if (!value_fits_shifted(*value, 30)) return first; // overflow guard
|
||||||
*value = *value << 30; ++last; break;
|
*value = *value << 30; ++last; break;
|
||||||
// case ' ':
|
// case ' ':
|
||||||
// case '\0': *value = *value * unit; break;
|
// case '\0': *value = *value * unit; break;
|
||||||
@@ -172,7 +177,7 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
|||||||
default:
|
default:
|
||||||
if (*value > std::numeric_limits<int64_t>::max() / unit ||
|
if (*value > std::numeric_limits<int64_t>::max() / unit ||
|
||||||
*value < std::numeric_limits<int64_t>::min() / unit)
|
*value < std::numeric_limits<int64_t>::min() / unit)
|
||||||
return src; // overflow guard
|
return first; // overflow guard
|
||||||
|
|
||||||
*value = *value * unit;
|
*value = *value * unit;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -71,10 +71,18 @@ rtorrent_Test_Src_SOURCES = $(rtorrent_Test_Common) \
|
|||||||
src/test_command_path.h \
|
src/test_command_path.h \
|
||||||
src/test_command_string.cc \
|
src/test_command_string.cc \
|
||||||
src/test_command_string.h \
|
src/test_command_string.h \
|
||||||
|
src/test_command_throttle.cc \
|
||||||
|
src/test_command_throttle.h \
|
||||||
src/test_command_tracker.cc \
|
src/test_command_tracker.cc \
|
||||||
src/test_command_tracker.h \
|
src/test_command_tracker.h \
|
||||||
src/test_download_list.cc \
|
src/test_download_list.cc \
|
||||||
src/test_download_list.h \
|
src/test_download_list.h \
|
||||||
|
src/test_input_path_input.cc \
|
||||||
|
src/test_input_path_input.h \
|
||||||
|
src/test_session_commit.cc \
|
||||||
|
src/test_session_commit.h \
|
||||||
|
src/test_session_storer.cc \
|
||||||
|
src/test_session_storer.h \
|
||||||
src/test_setup.cc \
|
src/test_setup.cc \
|
||||||
src/test_setup.h \
|
src/test_setup.h \
|
||||||
src/test_ui_download_list.cc \
|
src/test_ui_download_list.cc \
|
||||||
|
|||||||
Reference in New Issue
Block a user