restify / restify/node-restify
multipartBodyParser crash if mapping files array
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 10.7k
- Forks
- 975
- Avg merge
- 1d 6h
- Merged PRs (30d)
- 5
Description
- Used appropriate template for the issue type
- Searched both open and closed issues for duplicates of this issue
- Title adequately and concisely reflects the feature or the bug
Bug Report
Restify Version
8.5.1
Node.js Version
v10.15.1
Expected behaviour
No crash
Actual behaviour
Crash stack:
NodeError: The "path" argument must be one of type string, Buffer, or URL. Received type undefined
at Object.readFile (fs.js:297:3)
at forEach (/Users/guoyi/git/testServer/node_modules/restify/lib/plugins/multipartBodyParser.js:120:28)
at Array.forEach ()
at parse (/Users/guoyi/git/testServer/node_modules/restify/lib/plugins/multipartBodyParser.js:115:40)
at IncomingForm. (/Users/guoyi/git/testServer/node_modules/formidable/lib/incoming_form.js:107:9)
at IncomingForm.emit (events.js:189:13)
at IncomingForm._maybeEnd (/Users/guoyi/git/testServer/node_modules/formidable/lib/incoming_form.js:557:8)
at /Users/guoyi/git/testServer/node_modules/formidable/lib/incoming_form.js:238:12
at WriteStream. (/Users/guoyi/git/testServer/node_modules/formidable/lib/file.js:79:5)
at Object.onceWrapper (events.js:277:13)
Repro case
server side:
const restify = require('restify');
const server = restify.createServer({
name: 'Test Server',
maxParamLength: 1024,
});
server.use(restify.plugins.queryParser({ mapParams: false }));
server.use(restify.plugins.bodyParser({
mapParams: true,
mapFiles: true,
multiples: true,
}));
server.post("/files/upload", async (request, response) => {
return response.status(200).send(requst.url);
});
server.listen(3000, () => console.log(Server started on port 3000));
client side:
async function addAttachment(folder, files) {
const url = http://localhost:3000/files/upload;
const headers = {
host: hostname,
'contentType': 'multipart/form-data',
};
const formData = {
folder,
files: files.map((file) => fs.createReadStream(file)),
};
return new Promise((resolve, reject) => {
request.post({
url,
headers,
formData,
}, (err, httpResponse, body) => {
if (err) {
return reject(err);
}
if (httpResponse.statusCode === 200){
return resolve(body);
}
return reject(new Error('Unkown error'));
});
});
}
Cause
https://github.com/restify/node-restify/blob/master/lib/plugins/multipartBodyParser.js
line 120, not check array
Are you willing and able to fix this?
No
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in lib/plugins/multipartBodyParser.js at the reported line 120, then run the supplied server and client reproduction with bodyParser configured for mapParams, mapFiles, and multiples. Check how the files array is handled and verify that uploading multiple files completes without the reported undefined-path crash.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 38/100