diff --git a/lib/Local.js b/lib/Local.js index 7486bc7..98cf766 100644 --- a/lib/Local.js +++ b/lib/Local.js @@ -45,12 +45,24 @@ function Local(){ const obj = childProcess.spawnSync(that.binaryPath, that.getBinaryArgs()); this.tunnel = {pid: obj.pid}; var data = {}; - if(obj.stdout.length > 0) - data = JSON.parse(obj.stdout); - else if(obj.stderr.length > 0) - data = JSON.parse(obj.stderr); - else + if(obj.stdout.length > 0){ + try{ + data = JSON.parse(obj.stdout); + }catch(error){ + data = obj.stdout; + } + } else if(obj.stderr.length > 0){ + try{ + data = JSON.parse(obj.stderr); + }catch(error){ + data = obj.stderr; + } + } else { return new LocalError('No output received'); + } + if(typeof data === 'string'){ + return new LocalError('Malformed output received'); + } if(data['state'] != 'connected'){ return new LocalError(data['message']['message']); } else { @@ -93,21 +105,31 @@ function Local(){ that.retriesLeft -= 1; fs.unlinkSync(that.binaryPath); delete(that.binaryPath); - that.start(options, callback); - return; + return that.start(options, callback); } else { - callback(new LocalError(error.toString())); + return callback(new LocalError(error.toString())); } } var data = {}; - if(stdout) - data = JSON.parse(stdout); - else if(stderr) - data = JSON.parse(stderr); - else - callback(new LocalError('No output received')); - + if(stdout){ + try{ + data = JSON.parse(stdout); + }catch(error){ + data = stdout; + } + } else if(stderr){ + try{ + data = JSON.parse(stderr); + }catch(error){ + data = stderr; + } + } else { + return callback(new LocalError('No output received')); + } + if(typeof data === 'string'){ + return callback(new LocalError('Malformed output received')); + } if(data['state'] != 'connected'){ callback(new LocalError(data['message']['message'])); } else { @@ -126,7 +148,7 @@ function Local(){ this.stop = function (callback) { if(!this.pid) return callback(); this.killAllProcesses(function(error){ - if(error) callback(new LocalError(error.toString())); + if(error) return callback(new LocalError(error.toString())); callback(); }); }; @@ -316,6 +338,7 @@ function Local(){ this.killAllProcesses = function(callback){ psTree(this.pid, (err, children) => { + if(err) return callback(err); var childPids = children.map(val => val.PID); var killChecker = setInterval(() => { if(childPids.length === 0) {