diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2012-09-01 00:10:00 -0700 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2012-09-01 00:10:00 -0700 |
commit | 90489ae977eb74f0b7e997c8f67683b2c638c6bd (patch) | |
tree | 2fd59ee0edfc5f69a53f48f52d215be253028db9 | |
parent | ddbddcb31e298ad94f45547a72d0687ca323daa5 (diff) | |
parent | 9c94bdac0641b3df677d9ea19267e1838af36874 (diff) |
Merge pull request #1770 from laanwj/2012_08_rpcconsoleparsing2
RPC console: escaping within ' and " now handled differently
-rw-r--r-- | src/qt/rpcconsole.cpp | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 6e48fbe8da..7d5b6fed53 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -55,14 +55,14 @@ void RPCExecutor::start() /** * Split shell command line into a list of arguments. Aims to emulate \c bash and friends. - * + * * - Arguments are delimited with whitespace * - Extra whitespace at the beginning and end and between arguments will be ignored - * - Arguments can be "double" or 'single' quoted. Those are treated the same. - * - The backslash '\' is used as escape character + * - Text can be "double" or 'single' quoted + * - The backslash \c \ is used as escape character * - Outside quotes, any character can be escaped - * - Within double quotes, only escape double quotes with \" and backslashes with \\ - * - Within single quotes, only escape single quotes with \' and backslashes with \\ + * - Within double quotes, only escape \c " and backslashes before a \c " or another backslash + * - Within single quotes, no escaping is possible and no special interpretation takes place * * @param[out] args Parsed arguments will be appended to this list * @param[in] strCommand Command line to split @@ -76,7 +76,6 @@ bool parseCommandLine(std::vector<std::string> &args, const std::string &strComm STATE_SINGLEQUOTED, STATE_DOUBLEQUOTED, STATE_ESCAPE_OUTER, - STATE_ESCAPE_SINGLEQUOTED, STATE_ESCAPE_DOUBLEQUOTED } state = STATE_EATING_SPACES; std::string curarg; @@ -84,8 +83,8 @@ bool parseCommandLine(std::vector<std::string> &args, const std::string &strComm { switch(state) { - case STATE_ARGUMENT: // After argument - case STATE_EATING_SPACES: // Handle runs of spaces + case STATE_ARGUMENT: // In or after argument + case STATE_EATING_SPACES: // Handle runs of whitespace switch(ch) { case '"': state = STATE_DOUBLEQUOTED; break; @@ -106,7 +105,6 @@ bool parseCommandLine(std::vector<std::string> &args, const std::string &strComm switch(ch) { case '\'': state = STATE_ARGUMENT; break; - case '\\': state = STATE_ESCAPE_SINGLEQUOTED; break; default: curarg += ch; } break; @@ -121,12 +119,8 @@ bool parseCommandLine(std::vector<std::string> &args, const std::string &strComm case STATE_ESCAPE_OUTER: // '\' outside quotes curarg += ch; state = STATE_ARGUMENT; break; - case STATE_ESCAPE_SINGLEQUOTED: // '\' in single-quoted text - if(ch != '\'') curarg += '\\'; // keep '\' for everything but the quote - curarg += ch; state = STATE_SINGLEQUOTED; - break; case STATE_ESCAPE_DOUBLEQUOTED: // '\' in double-quoted text - if(ch != '"') curarg += '\\'; // keep '\' for everything but the quote + if(ch != '"' && ch != '\\') curarg += '\\'; // keep '\' for everything but the quote and '\' itself curarg += ch; state = STATE_DOUBLEQUOTED; break; } @@ -181,8 +175,7 @@ void RPCExecutor::request(const QString &command) emit reply(RPCConsole::CMD_ERROR, QString::fromStdString(message) + " (code " + QString::number(code) + ")"); } catch(std::runtime_error &) // raised when converting to invalid type, i.e. missing code or message - { - // Show raw JSON object + { // Show raw JSON object emit reply(RPCConsole::CMD_ERROR, QString::fromStdString(write_string(json_spirit::Value(objError), false))); } } |