fs: add validation for fd and path

Adds type validation to options fd & opts in `fs.createWriteStream` and
`fs.createReadStream`.

Fixes: https://github.com/nodejs/node/issues/35178

PR-URL: https://github.com/nodejs/node/pull/35187
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Co-authored-by: Antoine du Hamel <duhamelantoine1995@gmail.com>
This commit is contained in:
Dylan ElliottandAntoine du Hamel authored and Antoine du Hamel committed 2021-03-20 19:10:39 +01:00
1 parent d08ea01497
commit d4693ff430
2 files changed
+66 -1

No files matched your search

+17 -1
View File
@@ -28,6 +28,8 @@ const { Buffer } = require('buffer');
const {
copyObject,
getOptions,
getValidatedFd,
validatePath,
} = require('internal/fs/utils');
const { Readable, Writable, finished } = require('stream');
const { toPathIfFileURL } = require('internal/url');
@@ -119,7 +121,7 @@ function close(stream, err, cb) {
function importFd(stream, options) {
stream.fd = null;
if (options.fd) {
if (options.fd != null) {
if (typeof options.fd === 'number') {
// When fd is a raw descriptor, we must keep our fingers crossed
// that the descriptor won't get closed, or worse, replaced with
@@ -185,6 +187,13 @@ function ReadStream(path, options) {
this.pos = this.start;
}
// If fd has been set, validate, otherwise validate path.
if (this.fd != null) {
this.fd = getValidatedFd(this.fd);
} else {
validatePath(this.path);
}
if (this.end === undefined) {
this.end = Infinity;
} else if (this.end !== Infinity) {
@@ -344,6 +353,13 @@ function WriteStream(path, options) {
this.closed = false;
this[kIsPerformingIO] = false;
// If fd has been set, validate, otherwise validate path.
if (this.fd != null) {
this.fd = getValidatedFd(this.fd);
} else {
validatePath(this.path);
}
if (this.start !== undefined) {
validateInteger(this.start, 'start', 0);
+49
View File
@@ -0,0 +1,49 @@
'use strict';
require('../common');
const assert = require('assert');
const fs = require('fs');
{
const fd = 'k';
assert.throws(
() => {
fs.createReadStream(null, { fd });
},
{
code: 'ERR_INVALID_ARG_TYPE',
name: 'TypeError',
});
assert.throws(
() => {
fs.createWriteStream(null, { fd });
},
{
code: 'ERR_INVALID_ARG_TYPE',
name: 'TypeError',
});
}
{
const path = 46;
assert.throws(
() => {
fs.createReadStream(path);
},
{
code: 'ERR_INVALID_ARG_TYPE',
name: 'TypeError',
});
assert.throws(
() => {
fs.createWriteStream(path);
},
{
code: 'ERR_INVALID_ARG_TYPE',
name: 'TypeError',
});
}