Skip to content

Commit 47607df

Browse files
committed
[Qt] Console: don't allow empty arguments when using the comma-syntax
>>> backports bitcoin/bitcoin@390bd14
1 parent af215ef commit 47607df

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

src/qt/rpcexecutor.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
113113
{
114114
STATE_EATING_SPACES,
115115
STATE_EATING_SPACES_IN_ARG,
116+
STATE_EATING_SPACES_IN_BRACKETS,
116117
STATE_ARGUMENT,
117118
STATE_SINGLEQUOTED,
118119
STATE_DOUBLEQUOTED,
@@ -197,13 +198,16 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
197198
}
198199
case STATE_ARGUMENT: // In or after argument
199200
case STATE_EATING_SPACES_IN_ARG:
201+
case STATE_EATING_SPACES_IN_BRACKETS:
200202
case STATE_EATING_SPACES: // Handle runs of whitespace
201203
switch(ch)
202204
{
203205
case '"': state = STATE_DOUBLEQUOTED; break;
204206
case '\'': state = STATE_SINGLEQUOTED; break;
205207
case '\\': state = STATE_ESCAPE_OUTER; break;
206208
case '(': case ')': case '\n':
209+
if (state == STATE_EATING_SPACES_IN_ARG)
210+
throw std::runtime_error("Invalid Syntax");
207211
if (state == STATE_ARGUMENT)
208212
{
209213
if (ch == '(' && stack.size() && stack.back().size() > 0)
@@ -215,7 +219,7 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
215219

216220
stack.back().push_back(curarg);
217221
curarg.clear();
218-
state = STATE_EATING_SPACES;
222+
state = STATE_EATING_SPACES_IN_BRACKETS;
219223
}
220224
if ((ch == ')' || ch == '\n') && stack.size() > 0)
221225
{
@@ -239,12 +243,20 @@ bool RPCExecutor::ExecuteCommandLine(std::string& strResult, const std::string&
239243
}
240244
break;
241245
case ' ': case ',': case '\t':
242-
if(state == STATE_ARGUMENT || (state == STATE_EATING_SPACES_IN_ARG && ch == ',')) // 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
243250
{
244251
stack.back().push_back(curarg);
245252
curarg.clear();
246253
}
247-
state = (ch == ',' ? STATE_EATING_SPACES_IN_ARG : STATE_EATING_SPACES);
254+
if ((state == STATE_EATING_SPACES_IN_BRACKETS || state == STATE_ARGUMENT) && ch == ',')
255+
{
256+
state = STATE_EATING_SPACES_IN_ARG;
257+
break;
258+
}
259+
state = STATE_EATING_SPACES;
248260
break;
249261
default: curarg += ch; state = STATE_ARGUMENT;
250262
}

0 commit comments

Comments
 (0)