From 1af0fa4b84824e3b04c7668923365d23353c3453 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 5 Mar 2017 19:25:12 -0800 Subject: [PATCH] test: test buffer behavior when zeroFill undefined When ArrayBufferAllocator has an undefined zeroFill property, Buffer.allocUnsafe() should zero fill. Refs: https://github.com/nodejs/node/commit/27e84ddd4e1#commitcomment-19182129 PR-URL: https://github.com/nodejs/node/pull/11706 Reviewed-By: Anna Henningsen Reviewed-By: Franziska Hinkelmann --- .../test-buffer-bindingobj-no-zerofill.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 test/parallel/test-buffer-bindingobj-no-zerofill.js diff --git a/test/parallel/test-buffer-bindingobj-no-zerofill.js b/test/parallel/test-buffer-bindingobj-no-zerofill.js new file mode 100644 index 00000000000000..a9168713584e33 --- /dev/null +++ b/test/parallel/test-buffer-bindingobj-no-zerofill.js @@ -0,0 +1,53 @@ +'use strict'; + +// Flags: --expose-internals + +// Confirm that if a custom ArrayBufferAllocator does not define a zeroFill +// property, that the buffer module will zero-fill when allocUnsafe() is called. + +require('../common'); + +const assert = require('assert'); +const buffer = require('buffer'); + +// Monkey-patch setupBufferJS() to have an undefined zeroFill. +const process = require('process'); +const originalBinding = process.binding; + +const binding = originalBinding('buffer'); +const originalSetup = binding.setupBufferJS; + +binding.setupBufferJS = (proto, obj) => { + originalSetup(proto, obj); + assert.strictEqual(obj.zeroFill[0], 1); + delete obj.zeroFill; +}; + +const bindingObj = {}; + +binding.setupBufferJS(Buffer.prototype, bindingObj); +assert.strictEqual(bindingObj.zeroFill, undefined); + +process.binding = (bindee) => { + if (bindee === 'buffer') + return binding; + return originalBinding(bindee); +}; + +// Load from file system because internal buffer is already loaded and we're +// testing code that runs on first load only. +// Do not move this require() to top of file. It is important that +// `process.binding('buffer').setupBufferJS` be monkey-patched before this runs. +const monkeyPatchedBuffer = require('../../lib/buffer'); + +// On unpatched buffer, allocUnsafe() should not zero fill memory. It's always +// possible that a segment of memory is already zeroed out, so try again and +// again until we succeed or we time out. +let uninitialized = buffer.Buffer.allocUnsafe(1024); +while (uninitialized.some((val) => val !== 0)) + uninitialized = buffer.Buffer.allocUnsafe(1024); + +// On monkeypatched buffer, zeroFill property is undefined. allocUnsafe() should +// zero-fill in that case. +const zeroFilled = monkeyPatchedBuffer.Buffer.allocUnsafe(1024); +assert(zeroFilled.every((val) => val === 0));