From 8f6279b48bfa4f432d630ec1a425d4fa67aefab7 Mon Sep 17 00:00:00 2001 From: mhassan1 Date: Thu, 10 Apr 2025 11:53:31 -0700 Subject: [PATCH] fix: handle two busboy error events --- lib/make-middleware.js | 2 +- test/express-integration.js | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/make-middleware.js b/lib/make-middleware.js index cc26414a..327ebfe7 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -41,7 +41,7 @@ function makeMiddleware (setup) { if (isDone) return isDone = true req.unpipe(busboy) - process.nextTick(() => { + setImmediate(() => { busboy.removeAllListeners() }) next(err) diff --git a/test/express-integration.js b/test/express-integration.js index 74ebfed4..ff1757b4 100644 --- a/test/express-integration.js +++ b/test/express-integration.js @@ -150,4 +150,50 @@ describe('Express Integration', function () { req.write(body) req.end() }) + + it('should not crash on malformed request that causes two errors to be emitted by busboy', function (done) { + var upload = multer() + + app.post('/upload2', upload.single('file'), function (req, res) { + res.status(500).end('Request should not be processed') + }) + + app.use(function (err, req, res, next) { + assert.strictEqual(err.message, 'Malformed part header') + res.status(200).end('Correct error') + }) + + var boundary = 'AaB03x' + // this payload causes two errors to be emitted by busboy: `Malformed part header` and `Unexpected end of form` + var body = [ + '--' + boundary, + 'Content-Disposition: form-data; name="file"; filename="test.txt"', + 'Content-Type: text/plain', + '', + '--' + boundary + '--', + '' + ].join('\r\n') + var options = { + hostname: 'localhost', + port, + path: '/upload2', + method: 'POST', + headers: { + 'content-type': 'multipart/form-data; boundary=' + boundary, + 'content-length': body.length + } + } + + var req = http.request(options, (res) => { + assert.strictEqual(res.statusCode, 200) + done() + }) + + req.on('error', (err) => { + done(err) + }) + + req.write(body) + req.end() + }) })