mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-05 05:39:22 +00:00
Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8e5fb72867 | |||
| 880d381839 | |||
| b9782c71f5 | |||
| 2688f27f0a | |||
| 24ce818aaf | |||
| 12f3d6fe8f | |||
| 101ce5924c | |||
| 4bf094b6de | |||
| a84743b008 | |||
| eebfb5f5e5 | |||
| 991ebdabe0 | |||
| 2aaf1cbfd1 | |||
| b5b37a2e07 | |||
| 4831a44879 | |||
| 14c8d2b470 | |||
| 15756ddadc | |||
| e0c0d96aba | |||
| 7fbe54d4dd | |||
| 41209bc14d | |||
| 47eb1432b6 | |||
| d16263701a | |||
| d3f4d18164 | |||
| 6c6d2b9333 | |||
| f79cb257d7 |
@@ -1,7 +1,5 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "rpc/exec_file.h"
|
||||
|
||||
// #include <cassert>
|
||||
@@ -83,9 +81,8 @@ ExecFile::execute_object(const torrent::Object& rawArgs, int flags) {
|
||||
char* argsBuffer[max_args];
|
||||
char** argsCurrent = argsBuffer;
|
||||
|
||||
// On the heap: a buffer of buffer_size does not belong on the stack of whichever thread runs the command.
|
||||
auto valueStorage = std::make_unique<char[]>(buffer_size + 1);
|
||||
char* valueBuffer = valueStorage.get();
|
||||
// Size of value strings are less than 24.
|
||||
char valueBuffer[buffer_size+1];
|
||||
char* valueCurrent = valueBuffer;
|
||||
|
||||
if (rawArgs.is_list()) {
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ namespace rpc {
|
||||
class ExecFile {
|
||||
public:
|
||||
static constexpr unsigned int max_args = 128;
|
||||
static constexpr unsigned int buffer_size = 128 * 1024;
|
||||
static constexpr unsigned int buffer_size = 4096;
|
||||
|
||||
static constexpr int flag_expand_tilde = 0x1;
|
||||
static constexpr int flag_throw = 0x2;
|
||||
|
||||
+9
-14
@@ -118,32 +118,27 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
||||
if (base != 0 && base != 8 && base != 10 && base != 16)
|
||||
throw torrent::input_error("Command::string_to_value_unit(...) received invalid base.");
|
||||
|
||||
const char* first = src;
|
||||
|
||||
while (parse_is_space(*src))
|
||||
src++;
|
||||
|
||||
if (src[0] == '+')
|
||||
return first;
|
||||
return src;
|
||||
|
||||
if (src[0] == '-') {
|
||||
if (base == 8 || base == 16)
|
||||
return first;
|
||||
return src;
|
||||
|
||||
if (src[1] == '0')
|
||||
return first;
|
||||
return src;
|
||||
}
|
||||
|
||||
if (base == 10 && src[0] == '0' && (src[1] >= '0' && src[1] <= '9'))
|
||||
return first;
|
||||
|
||||
char* last{};
|
||||
|
||||
errno = 0;
|
||||
*value = strtoll(src, &last, base);
|
||||
|
||||
if (errno == ERANGE)
|
||||
return first;
|
||||
return src;
|
||||
|
||||
if (last == src) {
|
||||
*value = 0;
|
||||
@@ -153,7 +148,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, "false") == 0) { *value = 0; return src + strlen("false"); }
|
||||
|
||||
return first;
|
||||
return src;
|
||||
}
|
||||
|
||||
switch (*last) {
|
||||
@@ -161,15 +156,15 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
||||
case 'B': ++last; break;
|
||||
case 'k':
|
||||
case 'K':
|
||||
if (!value_fits_shifted(*value, 10)) return first; // overflow guard
|
||||
if (!value_fits_shifted(*value, 10)) return src; // overflow guard
|
||||
*value = *value << 10; ++last; break;
|
||||
case 'm':
|
||||
case 'M':
|
||||
if (!value_fits_shifted(*value, 20)) return first; // overflow guard
|
||||
if (!value_fits_shifted(*value, 20)) return src; // overflow guard
|
||||
*value = *value << 20; ++last; break;
|
||||
case 'g':
|
||||
case 'G':
|
||||
if (!value_fits_shifted(*value, 30)) return first; // overflow guard
|
||||
if (!value_fits_shifted(*value, 30)) return src; // overflow guard
|
||||
*value = *value << 30; ++last; break;
|
||||
// case ' ':
|
||||
// case '\0': *value = *value * unit; break;
|
||||
@@ -177,7 +172,7 @@ parse_value_nothrow(const char* src, int64_t* value, int base, int unit) {
|
||||
default:
|
||||
if (*value > std::numeric_limits<int64_t>::max() / unit ||
|
||||
*value < std::numeric_limits<int64_t>::min() / unit)
|
||||
return first; // overflow guard
|
||||
return src; // overflow guard
|
||||
|
||||
*value = *value * unit;
|
||||
break;
|
||||
|
||||
@@ -71,18 +71,10 @@ rtorrent_Test_Src_SOURCES = $(rtorrent_Test_Common) \
|
||||
src/test_command_path.h \
|
||||
src/test_command_string.cc \
|
||||
src/test_command_string.h \
|
||||
src/test_command_throttle.cc \
|
||||
src/test_command_throttle.h \
|
||||
src/test_command_tracker.cc \
|
||||
src/test_command_tracker.h \
|
||||
src/test_download_list.cc \
|
||||
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.h \
|
||||
src/test_ui_download_list.cc \
|
||||
|
||||
Reference in New Issue
Block a user