From b02d50367564fc81e8d5f28bfcfc7807831f7759 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 6 Aug 2019 17:48:06 +0100 Subject: [PATCH] fix: do not allow empty or invalid node args when spin up child process (#73) --- src/WorkerPool.js | 6 +++++- test/workerPool.test.js | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/WorkerPool.js b/src/WorkerPool.js index 6e917eb..f7faacb 100644 --- a/src/WorkerPool.js +++ b/src/WorkerPool.js @@ -18,8 +18,12 @@ class PoolWorker { this.activeJobs = 0; this.onJobDone = onJobDone; this.id = workerId; + workerId += 1; - this.worker = childProcess.spawn(process.execPath, [].concat(options.nodeArgs || []).concat(workerPath, options.parallelJobs), { + // Empty or invalid node args would break the child process + const sanitizedNodeArgs = (options.nodeArgs || []).filter(opt => !!opt); + + this.worker = childProcess.spawn(process.execPath, [].concat(sanitizedNodeArgs).concat(workerPath, options.parallelJobs), { detached: true, stdio: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'], }); diff --git a/test/workerPool.test.js b/test/workerPool.test.js index e27a564..b0266c6 100644 --- a/test/workerPool.test.js +++ b/test/workerPool.test.js @@ -41,4 +41,28 @@ describe('workerPool', () => { workerPool.terminate(); expect(workerPool.isAbleToRun()).toBe(false); }); + + it('should sanitize nodeArgs when spawn a child process', () => { + childProcess.spawn.mockClear(); + childProcess.spawn.mockImplementationOnce(() => { + return { + stdio: new Array(5).fill(new stream.PassThrough()), + unref: jest.fn(), + }; + }); + + const workerPool = new WorkerPool({ + workerNodeArgs: [ + '--max-old-space-size=1024', + '', + null, + ], + workerParallelJobs: 20, + }); + + expect(() => workerPool.createWorker()).not.toThrow(); + + const nonSanitizedNodeArgs = childProcess.spawn.mock.calls[0][1].filter(opt => !opt); + expect(nonSanitizedNodeArgs.length).toEqual(0); + }); });