Skip to content

Commit

Permalink
stream: validate writable defaultEncoding
Browse files Browse the repository at this point in the history
PR-URL: #46322
Fixes: #46301
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
  • Loading branch information
marco-ippolito committed Jan 30, 2023
1 parent a5fd53f commit 9e7093f
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
9 changes: 8 additions & 1 deletion lib/internal/streams/writable.js
Expand Up @@ -122,7 +122,14 @@ function WritableState(options, stream, isDuplex) {
// Crypto is kind of old and crusty. Historically, its default string
// encoding is 'binary' so we have to make this configurable.
// Everything else in the universe uses 'utf8', though.
this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
const defaultEncoding = options?.defaultEncoding;
if (defaultEncoding == null) {
this.defaultEncoding = 'utf8';
} else if (Buffer.isEncoding(defaultEncoding)) {
this.defaultEncoding = defaultEncoding;
} else {
throw new ERR_UNKNOWN_ENCODING(defaultEncoding);
}

// Not an actual buffer we keep track of, but a measurement
// of how much we're waiting to get pushed to some underlying
Expand Down
47 changes: 47 additions & 0 deletions test/parallel/test-stream-writable-decoded-encoding.js
Expand Up @@ -56,3 +56,50 @@ class MyWritable extends stream.Writable {
m.write('some-text', 'utf8');
m.end();
}

{
assert.throws(() => {
const m = new MyWritable(null, {
defaultEncoding: 'my invalid encoding',
});
m.end();
}, {
code: 'ERR_UNKNOWN_ENCODING',
});
}

{
const w = new MyWritable(function(isBuffer, type, enc) {
assert(!isBuffer);
assert.strictEqual(type, 'string');
assert.strictEqual(enc, 'hex');
}, {
defaultEncoding: 'hex',
decodeStrings: false
});
w.write('asd');
w.end();
}

{
const w = new MyWritable(function(isBuffer, type, enc) {
assert(!isBuffer);
assert.strictEqual(type, 'string');
assert.strictEqual(enc, 'utf8');
}, {
defaultEncoding: null,
decodeStrings: false
});
w.write('asd');
w.end();
}

{
const m = new MyWritable(function(isBuffer, type, enc) {
assert.strictEqual(type, 'object');
assert.strictEqual(enc, 'utf8');
}, { defaultEncoding: 'hex',
objectMode: true });
m.write({ foo: 'bar' }, 'utf8');
m.end();
}

0 comments on commit 9e7093f

Please sign in to comment.