From 0ebbc5ea8fdd29ac998854fb7dc97c89533e25fb Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 19 Aug 2024 16:04:38 -0700 Subject: [PATCH] server: sketchy check to determine if buffer is pool buffer --- server/package-lock.json | 4 ++-- server/src/plugin/runtime/node-thread-worker.ts | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 690bdfb68..fe5c83791 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/server", - "version": "0.115.23", + "version": "0.115.24", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/server", - "version": "0.115.23", + "version": "0.115.24", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/server/src/plugin/runtime/node-thread-worker.ts b/server/src/plugin/runtime/node-thread-worker.ts index 0848e746e..ce8cc4b95 100644 --- a/server/src/plugin/runtime/node-thread-worker.ts +++ b/server/src/plugin/runtime/node-thread-worker.ts @@ -12,9 +12,14 @@ class BufferTransfer implements RpcSerializer { if (!serializationContext) return this.bufferSerializer.serialize(value); - // must create a copy. Buffers as allocated by node are not transferable. - const ab = value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength); - value = Buffer.from(ab); + // node may used pooled buffers for Buffer.allocUnsafe, Buffer.from, and other calls. + // these buffers will be smaller than Buffer.poolSize. + // In these instances, do not transfer the buffer, as it may not be transferible. + // create a copy so it can be safely transfered. + if (value.buffer.byteLength <= Buffer.poolSize) { + const ab = value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength); + value = Buffer.from(ab); + } serializationContext.transferList ||= []; const transferList: worker_threads.TransferListItem[] = serializationContext.transferList;