diff --git a/lib/common/asar.js b/lib/common/asar.js index 262412813221..1d8474d1c563 100644 --- a/lib/common/asar.js +++ b/lib/common/asar.js @@ -589,6 +589,23 @@ return mkdirSync(p, mode) } } + + // Executing a command string containing a path to an asar + // archive confuses `child_process.execFile`, which is internally + // called by `child_process.{exec,execSync}`, causing + // Electron to consider the full command as a single path + // to an archive. + [ 'exec', 'execSync' ].forEach(function (functionName) { + var old = child_process[functionName] + child_process[functionName] = function () { + var processNoAsarOriginalValue = process.noAsar + process.noAsar = true + var result = old.apply(this, arguments) + process.noAsar = processNoAsarOriginalValue + return result + } + }) + overrideAPI(fs, 'open') overrideAPI(child_process, 'execFile') overrideAPISync(process, 'dlopen', 1) diff --git a/spec/asar-spec.js b/spec/asar-spec.js index f9c4e98ae8fa..ac0779d2f266 100644 --- a/spec/asar-spec.js +++ b/spec/asar-spec.js @@ -555,6 +555,30 @@ describe('asar package', function () { }) }) + describe('child_process.exec', function () { + var child_process = require('child_process'); + var echo = path.join(fixtures, 'asar', 'echo.asar', 'echo') + + it('should not try to extract the command if there is a reference to a file inside an .asar', function (done) { + child_process.exec('echo ' + echo + ' foo bar', function (error, stdout) { + assert.equal(error, null) + assert.equal(stdout.toString().replace(/\r/g, ''), echo + ' foo bar\n') + done() + }) + }) + }) + + describe('child_process.execSync', function () { + var child_process = require('child_process'); + var echo = path.join(fixtures, 'asar', 'echo.asar', 'echo') + + it('should not try to extract the command if there is a reference to a file inside an .asar', function (done) { + var stdout = child_process.execSync('echo ' + echo + ' foo bar') + assert.equal(stdout.toString().replace(/\r/g, ''), echo + ' foo bar\n') + done() + }) + }) + describe('child_process.execFile', function () { var echo, execFile, execFileSync, ref2 if (process.platform !== 'darwin') {