Skip to content
Snippets Groups Projects
Commit c6515aa6 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Wrap the body of parse_command() in a try/catch to turn errors into warnings

As requested by Keyop in #synchrob0yyz
parent b286aa74
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #4724 passed
......@@ -647,130 +647,134 @@ function handle_command(command, args, defs)
function parse_command(line)
{
function execute_line(args) {
if(args.length >= 2) {
command=args[1].toUpperCase();
args.splice(1,1);
if(handle_command(command, args, any_state_command_handlers))
return;
switch(state) {
case UnAuthenticated:
if(handle_command(command, args, unauthenticated_command_handlers))
return;
break;
case Authenticated:
if(handle_command(command, args, authenticated_command_handlers))
return;
break;
case Selected:
if(handle_command(command, args, selected_command_handlers))
return;
if(handle_command(command, args, authenticated_command_handlers))
return;
break;
try {
function execute_line(args) {
if(args.length >= 2) {
command=args[1].toUpperCase();
args.splice(1,1);
if(handle_command(command, args, any_state_command_handlers))
return;
switch(state) {
case UnAuthenticated:
if(handle_command(command, args, unauthenticated_command_handlers))
return;
break;
case Authenticated:
if(handle_command(command, args, authenticated_command_handlers))
return;
break;
case Selected:
if(handle_command(command, args, selected_command_handlers))
return;
if(handle_command(command, args, authenticated_command_handlers))
return;
break;
}
}
// Ignore empty lines (Seamonkey sends these...)
if (args.length > 0)
tagged(args[0], "BAD", "Bad dog, no cookie.");
}
// Ignore empty lines (Seamonkey sends these...)
if (args.length > 0)
tagged(args[0], "BAD", "Bad dog, no cookie.");
}
function parse_line() {
var at_start=true;
var in_quote=false;
var paren_depth=0;
var string_len;
var args=[];
var pos;
function parse_atom() {
var ret='';
while(line.length) {
switch(line.charAt(0)) {
case ')':
return(ret);
case ' ':
line=line.substr(1);
return(ret);
default:
ret += line.charAt(0);
line=line.substr(1);
break;
function parse_line() {
var at_start=true;
var in_quote=false;
var paren_depth=0;
var string_len;
var args=[];
var pos;
function parse_atom() {
var ret='';
while(line.length) {
switch(line.charAt(0)) {
case ')':
return(ret);
case ' ':
line=line.substr(1);
return(ret);
default:
ret += line.charAt(0);
line=line.substr(1);
break;
}
}
return(ret);
}
return(ret);
}
function parse_string()
{
var ret='';
if (line.search(/^{([0-9]+)}$/) !== 0)
throw new Error('invalid string literal ('+line+'), aborting');
line=line.replace(/^{([0-9]+)}$/, "$1");
client.socket.send("+ Give me more of that good stuff\r\n");
var len = parseInt(line);
if(len) {
ret=client.socket.recv(len);
if (ret === null)
throw new Error('recv() of ' + len + ' bytes returned null');
if (ret.length !== len)
throw new Error('recv() of ' + len + ' bytes returned a string with ' + ret.length + ' instead.');
line=client.socket.recvline(10240, 1800);
function parse_string()
{
var ret='';
if (line.search(/^{([0-9]+)}$/) !== 0)
throw new Error('invalid string literal ('+line+'), aborting');
line=line.replace(/^{([0-9]+)}$/, "$1");
client.socket.send("+ Give me more of that good stuff\r\n");
var len = parseInt(line);
if(len) {
ret=client.socket.recv(len);
if (ret === null)
throw new Error('recv() of ' + len + ' bytes returned null');
if (ret.length !== len)
throw new Error('recv() of ' + len + ' bytes returned a string with ' + ret.length + ' instead.');
line=client.socket.recvline(10240, 1800);
}
else {
line = undefined;
}
return(ret);
}
else {
line = undefined;
function parse_quotedstring() {
var ret='';
line=line.substr(1); // Remove leading "
while(line.length) {
switch(line.charAt(0)) {
case '"':
line=line.substr(1);
return(ret);
default:
ret += line.charAt(0);
line=line.substr(1);
break;
}
}
return(ret);
}
return(ret);
}
function parse_quotedstring() {
var ret='';
line=line.substr(1); // Remove leading "
while(line.length) {
while(line) {
switch(line.charAt(0)) {
case '"':
args.push(parse_quotedstring());
break;
case ')':
line=line.substr(1);
return(ret);
default:
ret += line.charAt(0);
return(args);
case '(':
line=line.substr(1);
args.push(parse_line());
break;
case '{':
args.push(parse_string());
break;
case ' ':
line=line.substr(1);
break;
default:
args.push(parse_atom());
break;
}
}
return(ret);
return(args);
}
while(line) {
switch(line.charAt(0)) {
case '"':
args.push(parse_quotedstring());
break;
case ')':
line=line.substr(1);
return(args);
case '(':
line=line.substr(1);
args.push(parse_line());
break;
case '{':
args.push(parse_string());
break;
case ' ':
line=line.substr(1);
break;
default:
args.push(parse_atom());
break;
}
}
return(args);
send_updates();
return(execute_line(parse_line()));
} catch(error) {
log(LOG_WARNING, "Exception during command parsing: " + error);
}
send_updates();
return(execute_line(parse_line()));
}
// Command handling functions
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment