@@ -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