Skip to content

Commit ac4c11f

Browse files
committed
Merge bitcoin#2516: [GUI][BUG] Console: allow empty arguments
47607df [Qt] Console: don't allow empty arguments when using the comma-syntax (random-zebra) af215ef [Qt] Console: allow empty arguments (random-zebra) Pull request description: bitcoin#2372 broke the support for empty arguments `""` (which is required as first argument of `sendmany`). Backport the fix from bitcoin#9329 Thanks to @NoobieDev12 for reporting this bug. ACKs for top commit: furszy: Nice catch👌, ACK 47607df Fuzzbawls: ACK 47607df Tree-SHA512: 9ebcce3fbcb10856fc0a586365a9f0c4a3bbed5df571f21b37a143a882ab937b0fdf0502d1ba39e015cc0f745b07ed78fa8eb547110d0e53401f0d88af89cba1
2 parents 26b128a + 47607df commit ac4c11f

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

src/qt/rpcexecutor.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
112112
enum CmdParseState
113113
{
114114
STATE_EATING_SPACES,
115+
STATE_EATING_SPACES_IN_ARG,
116+
STATE_EATING_SPACES_IN_BRACKETS,
115117
STATE_ARGUMENT,
116118
STATE_SINGLEQUOTED,
117119
STATE_DOUBLEQUOTED,
@@ -195,26 +197,29 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
195197
break;
196198
}
197199
case STATE_ARGUMENT: // In or after argument
200+
case STATE_EATING_SPACES_IN_ARG:
201+
case STATE_EATING_SPACES_IN_BRACKETS:
198202
case STATE_EATING_SPACES: // Handle runs of whitespace
199203
switch(ch)
200204
{
201205
case '"': state = STATE_DOUBLEQUOTED; break;
202206
case '\'': state = STATE_SINGLEQUOTED; break;
203207
case '\\': state = STATE_ESCAPE_OUTER; break;
204208
case '(': case ')': case '\n':
209+
if (state == STATE_EATING_SPACES_IN_ARG)
210+
throw std::runtime_error("Invalid Syntax");
205211
if (state == STATE_ARGUMENT)
206212
{
207213
if (ch == '(' && stack.size() && stack.back().size() > 0)
208214
stack.push_back(std::vector<std::string>());
209-
if (curarg.size())
210-
{
211-
// don't allow commands after executed commands on baselevel
212-
if (!stack.size())
213-
throw std::runtime_error("Invalid Syntax");
214-
stack.back().push_back(curarg);
215-
}
215+
216+
// don't allow commands after executed commands on baselevel
217+
if (!stack.size())
218+
throw std::runtime_error("Invalid Syntax");
219+
220+
stack.back().push_back(curarg);
216221
curarg.clear();
217-
state = STATE_EATING_SPACES;
222+
state = STATE_EATING_SPACES_IN_BRACKETS;
218223
}
219224
if ((ch == ')' || ch == '\n') && stack.size() > 0)
220225
{
@@ -238,12 +243,19 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
238243
}
239244
break;
240245
case ' ': case ',': case '\t':
241-
if(state == STATE_ARGUMENT) // Space ends argument
246+
if(state == STATE_EATING_SPACES_IN_ARG && curarg.empty() && ch == ',')
247+
throw std::runtime_error("Invalid Syntax");
248+
249+
else if(state == STATE_ARGUMENT) // Space ends argument
242250
{
243-
if (curarg.size())
244-
stack.back().push_back(curarg);
251+
stack.back().push_back(curarg);
245252
curarg.clear();
246253
}
254+
if ((state == STATE_EATING_SPACES_IN_BRACKETS || state == STATE_ARGUMENT) && ch == ',')
255+
{
256+
state = STATE_EATING_SPACES_IN_ARG;
257+
break;
258+
}
247259
state = STATE_EATING_SPACES;
248260
break;
249261
default: curarg += ch; state = STATE_ARGUMENT;

0 commit comments

Comments
 (0)