summaryrefslogtreecommitdiff
path: root/src/node_buffer.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-12-02 16:28:35 +0100
committerAnna Henningsen <anna@addaleax.net>2017-12-05 12:35:10 +0100
commit69a68c0b24b68a9f2d3e64fb0f968772f113f813 (patch)
treeb74eed7dc24f39d83a35d7a5409b6d3c122dde3b /src/node_buffer.cc
parentb31626ef986f42d9113200a69940668c79b0f03e (diff)
downloadandroid-node-v8-69a68c0b24b68a9f2d3e64fb0f968772f113f813.tar.gz
android-node-v8-69a68c0b24b68a9f2d3e64fb0f968772f113f813.tar.bz2
android-node-v8-69a68c0b24b68a9f2d3e64fb0f968772f113f813.zip
buffer: zero-fill buffer allocated with invalid content
Zero-fill when `Buffer.alloc()` receives invalid fill data. A solution like https://github.com/nodejs/node/pull/17427 which switches to throwing makes sense, but is likely a breaking change. This suggestion leaves the behaviour of `buffer.fill()` untouched, since any change to it would be a breaking change, and lets `Buffer.alloc()` check whether any filling took place or not. PR-URL: https://github.com/nodejs/node/pull/17428 Refs: https://github.com/nodejs/node/pull/17427 Refs: https://github.com/nodejs/node/issues/17423 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
Diffstat (limited to 'src/node_buffer.cc')
-rw-r--r--src/node_buffer.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/node_buffer.cc b/src/node_buffer.cc
index e810760790..ca2c6a89cb 100644
--- a/src/node_buffer.cc
+++ b/src/node_buffer.cc
@@ -591,6 +591,8 @@ void Fill(const FunctionCallbackInfo<Value>& args) {
THROW_AND_RETURN_IF_OOB(start <= end);
THROW_AND_RETURN_IF_OOB(fill_length + start <= ts_obj_length);
+ args.GetReturnValue().Set(static_cast<double>(fill_length));
+
// First check if Buffer has been passed.
if (Buffer::HasInstance(args[1])) {
SPREAD_BUFFER_ARG(args[1], fill_obj);
@@ -612,8 +614,10 @@ void Fill(const FunctionCallbackInfo<Value>& args) {
enc == UTF8 ? str_obj->Utf8Length() :
enc == UCS2 ? str_obj->Length() * sizeof(uint16_t) : str_obj->Length();
- if (str_length == 0)
+ if (str_length == 0) {
+ args.GetReturnValue().Set(0);
return;
+ }
// Can't use StringBytes::Write() in all cases. For example if attempting
// to write a two byte character into a one byte Buffer.
@@ -643,7 +647,7 @@ void Fill(const FunctionCallbackInfo<Value>& args) {
// TODO(trevnorris): Should this throw? Because of the string length was
// greater than 0 but couldn't be written then the string was invalid.
if (str_length == 0)
- return;
+ return args.GetReturnValue().Set(0);
}
start_fill: