Skip to content

Commit c019e99

Browse files
author
Jérémy Lourenço
committed
fix(cve): bump busboy to fix CVE-2022-24434
1 parent 4f4326a commit c019e99

File tree

6 files changed

+32
-42
lines changed

6 files changed

+32
-42
lines changed

lib/make-middleware.js

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
var is = require('type-is')
22
var Busboy = require('busboy')
33
var extend = require('xtend')
4-
var onFinished = require('on-finished')
54
var appendField = require('append-field')
65

76
var Counter = require('./counter')
87
var MulterError = require('./multer-error')
98
var FileAppender = require('./file-appender')
109
var removeUploadedFiles = require('./remove-uploaded-files')
1110

12-
function drainStream (stream) {
13-
stream.on('readable', stream.read.bind(stream))
14-
}
15-
1611
function makeMiddleware (setup) {
1712
return function multerMiddleware (req, res, next) {
1813
if (!is(req, ['multipart'])) return next()
@@ -30,7 +25,7 @@ function makeMiddleware (setup) {
3025
var busboy
3126

3227
try {
33-
busboy = new Busboy({ headers: req.headers, limits: limits, preservePath: preservePath })
28+
busboy = Busboy({ headers: req.headers, limits: limits, preservePath: preservePath })
3429
} catch (err) {
3530
return next(err)
3631
}
@@ -45,12 +40,9 @@ function makeMiddleware (setup) {
4540
function done (err) {
4641
if (isDone) return
4742
isDone = true
48-
4943
req.unpipe(busboy)
50-
drainStream(req)
5144
busboy.removeAllListeners()
52-
53-
onFinished(req, function () { next(err) })
45+
next(err)
5446
}
5547

5648
function indicateDone () {
@@ -80,9 +72,9 @@ function makeMiddleware (setup) {
8072
}
8173

8274
// handle text field data
83-
busboy.on('field', function (fieldname, value, fieldnameTruncated, valueTruncated) {
75+
busboy.on('field', function (fieldname, value, { nameTruncated, valueTruncated }) {
8476
if (fieldname == null) return abortWithCode('MISSING_FIELD_NAME')
85-
if (fieldnameTruncated) return abortWithCode('LIMIT_FIELD_KEY')
77+
if (nameTruncated) return abortWithCode('LIMIT_FIELD_KEY')
8678
if (valueTruncated) return abortWithCode('LIMIT_FIELD_VALUE', fieldname)
8779

8880
// Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6)
@@ -94,7 +86,7 @@ function makeMiddleware (setup) {
9486
})
9587

9688
// handle files
97-
busboy.on('file', function (fieldname, fileStream, filename, encoding, mimetype) {
89+
busboy.on('file', function (fieldname, fileStream, { filename, encoding, mimeType }) {
9890
// don't attach to the files object, if there is no file
9991
if (!filename) return fileStream.resume()
10092

@@ -107,7 +99,7 @@ function makeMiddleware (setup) {
10799
fieldname: fieldname,
108100
originalname: filename,
109101
encoding: encoding,
110-
mimetype: mimetype
102+
mimetype: mimeType
111103
}
112104

113105
var placeholder = appender.insertPlaceholder(file)
@@ -169,7 +161,7 @@ function makeMiddleware (setup) {
169161
busboy.on('partsLimit', function () { abortWithCode('LIMIT_PART_COUNT') })
170162
busboy.on('filesLimit', function () { abortWithCode('LIMIT_FILE_COUNT') })
171163
busboy.on('fieldsLimit', function () { abortWithCode('LIMIT_FIELD_COUNT') })
172-
busboy.on('finish', function () {
164+
busboy.on('close', function () {
173165
readFinished = true
174166
indicateDone()
175167
})

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
],
2121
"dependencies": {
2222
"append-field": "^1.0.0",
23-
"busboy": "^0.2.11",
23+
"busboy": "^1.0.0",
2424
"concat-stream": "^1.5.2",
2525
"mkdirp": "^0.5.4",
2626
"object-assign": "^4.1.1",
27-
"on-finished": "^2.3.0",
2827
"type-is": "^1.6.4",
2928
"xtend": "^4.0.0"
3029
},

test/_util.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var fs = require('fs')
22
var path = require('path')
33
var stream = require('stream')
4-
var onFinished = require('on-finished')
54

65
exports.file = function file (name) {
76
return fs.createReadStream(path.join(__dirname, 'files', name))
@@ -17,19 +16,14 @@ exports.submitForm = function submitForm (multer, form, cb) {
1716

1817
var req = new stream.PassThrough()
1918

20-
req.complete = false
21-
form.once('end', function () {
22-
req.complete = true
23-
})
24-
2519
form.pipe(req)
2620
req.headers = {
2721
'content-type': 'multipart/form-data; boundary=' + form.getBoundary(),
2822
'content-length': length
2923
}
3024

3125
multer(req, null, function (err) {
32-
onFinished(req, function () { cb(err, req) })
26+
cb(err, req)
3327
})
3428
})
3529
}

test/error-handling.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ describe('Error Handling', function () {
244244
req.end(body)
245245

246246
upload(req, null, function (err) {
247-
assert.strictEqual(err.message, 'Unexpected end of multipart data')
247+
assert.strictEqual(err.message, 'Unexpected end of form')
248248
done()
249249
})
250250
})

test/express-integration.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ var util = require('./_util')
88
var express = require('express')
99
var FormData = require('form-data')
1010
var concat = require('concat-stream')
11-
var onFinished = require('on-finished')
1211

1312
var port = 34279
1413

@@ -27,7 +26,7 @@ describe('Express Integration', function () {
2726
req.on('response', function (res) {
2827
res.on('error', cb)
2928
res.pipe(concat({ encoding: 'buffer' }, function (body) {
30-
onFinished(req, function () { cb(null, res, body) })
29+
cb(null, res, body)
3130
}))
3231
})
3332
}

test/unicode.js

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
var assert = require('assert')
44

5-
var path = require('path')
6-
var util = require('./_util')
75
var multer = require('../')
86
var temp = require('fs-temp')
97
var rimraf = require('rimraf')
10-
var FormData = require('form-data')
8+
var stream = require('stream')
119

1210
describe('Unicode', function () {
1311
var uploadDir, upload
@@ -34,21 +32,29 @@ describe('Unicode', function () {
3432
})
3533

3634
it('should handle unicode filenames', function (done) {
37-
var form = new FormData()
38-
var parser = upload.single('small0')
39-
var filename = '\ud83d\udca9.dat'
40-
41-
form.append('small0', util.file('small0.dat'), { filename: filename })
42-
43-
util.submitForm(parser, form, function (err, req) {
35+
var req = new stream.PassThrough()
36+
var boundary = 'AaB03x'
37+
var body = [
38+
'--' + boundary,
39+
'Content-Disposition: form-data; name="small0"; filename="poo.dat"; filename*=utf-8\'\'%F0%9F%92%A9.dat',
40+
'Content-Type: text/plain',
41+
'',
42+
'test with unicode filename',
43+
'--' + boundary + '--'
44+
].join('\r\n')
45+
46+
req.headers = {
47+
'content-type': 'multipart/form-data; boundary=' + boundary,
48+
'content-length': body.length
49+
}
50+
51+
req.end(body)
52+
53+
upload.single('small0')(req, null, function (err) {
4454
assert.ifError(err)
4555

46-
assert.strictEqual(path.basename(req.file.path), filename)
47-
assert.strictEqual(req.file.originalname, filename)
48-
56+
assert.strictEqual(req.file.originalname, '\ud83d\udca9.dat')
4957
assert.strictEqual(req.file.fieldname, 'small0')
50-
assert.strictEqual(req.file.size, 1778)
51-
assert.strictEqual(util.fileSize(req.file.path), 1778)
5258

5359
done()
5460
})

0 commit comments

Comments
 (0)