restify / restify/node-restify

multipartBodyParser crash if mapping files array

Open
#1,819 1 comment 0 reactions 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.