fix(napi): buffer finalizer is nullable (#30514)
Some checks are pending
ci / build libs (push) Blocked by required conditions
ci / publish canary (push) Blocked by required conditions
ci / test release windows-x86_64 (push) Blocked by required conditions
ci / test release macos-aarch64 (push) Blocked by required conditions
ci / bench release linux-x86_64 (push) Blocked by required conditions
ci / lint debug linux-x86_64 (push) Blocked by required conditions
ci / lint debug macos-x86_64 (push) Blocked by required conditions
ci / lint debug windows-x86_64 (push) Blocked by required conditions
ci / test debug linux-x86_64 (push) Blocked by required conditions
ci / test release linux-x86_64 (push) Blocked by required conditions
ci / test debug macos-x86_64 (push) Blocked by required conditions
ci / pre-build (push) Waiting to run
ci / test debug linux-aarch64 (push) Blocked by required conditions
ci / test release linux-aarch64 (push) Blocked by required conditions
ci / test debug macos-aarch64 (push) Blocked by required conditions
ci / test release macos-x86_64 (push) Blocked by required conditions
ci / test debug windows-x86_64 (push) Blocked by required conditions

Fixes: https://github.com/denoland/deno/issues/30512
This commit is contained in:
snek 2025-08-25 12:57:01 +02:00 committed by GitHub
parent 55f43d0373
commit 9450d0798f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 37 additions and 6 deletions

View file

@ -2938,7 +2938,7 @@ fn napi_create_external_arraybuffer<'s>(
env: &'s mut Env,
data: *mut c_void,
byte_length: usize,
finalize_cb: napi_finalize,
finalize_cb: Option<napi_finalize>,
finalize_hint: *mut c_void,
result: *mut napi_value<'s>,
) -> napi_status {

View file

@ -319,7 +319,7 @@ fn napi_create_external_buffer<'s>(
env: &'s mut Env,
length: usize,
data: *mut c_void,
finalize_cb: napi_finalize,
finalize_cb: Option<napi_finalize>,
finalize_hint: *mut c_void,
result: *mut napi_value<'s>,
) -> napi_status {

View file

@ -25,15 +25,17 @@ pub fn get_array_buffer_ptr(ab: v8::Local<v8::ArrayBuffer>) -> *mut c_void {
struct BufferFinalizer {
env: *mut Env,
finalize_cb: napi_finalize,
finalize_cb: Option<napi_finalize>,
finalize_data: *mut c_void,
finalize_hint: *mut c_void,
}
impl Drop for BufferFinalizer {
fn drop(&mut self) {
unsafe {
(self.finalize_cb)(self.env as _, self.finalize_data, self.finalize_hint);
if let Some(finalize_cb) = self.finalize_cb {
unsafe {
finalize_cb(self.env as _, self.finalize_data, self.finalize_hint);
}
}
}
}
@ -56,7 +58,7 @@ pub(crate) fn make_external_backing_store(
data: *mut c_void,
byte_length: usize,
finalize_data: *mut c_void,
finalize_cb: napi_finalize,
finalize_cb: Option<napi_finalize>,
finalize_hint: *mut c_void,
) -> v8::UniqueRef<v8::BackingStore> {
let finalizer = Box::new(BufferFinalizer {

View file

@ -1,6 +1,7 @@
// Copyright 2018-2025 the Deno authors. MIT license.
import { assert, assertEquals, loadTestLibrary } from "./common.js";
import { Buffer } from "node:buffer";
const typedarray = loadTestLibrary();
@ -22,3 +23,8 @@ Deno.test("napi arraybuffer is detached", function () {
assert(!typedarray.is_detached(value));
});
});
Deno.test("napi buffer finalizer may be null", () => {
const buf = typedarray.test_static_external_buffer();
assertEquals(buf, Buffer.from([1, 2, 3]));
});

View file

@ -107,6 +107,24 @@ extern "C" fn test_external_buffer(
result
}
extern "C" fn test_static_external_buffer(
env: napi_env,
_: napi_callback_info,
) -> napi_value {
let mut result = ptr::null_mut();
static BUF: &[u8] = &[1, 2, 3];
assert_napi_ok!(napi_create_external_buffer(
env,
BUF.len(),
BUF.as_ptr() as _,
None,
ptr::null_mut(),
&mut result
));
result
}
extern "C" fn test_external_arraybuffer(
env: napi_env,
_: napi_callback_info,
@ -136,6 +154,11 @@ pub fn init(env: napi_env, exports: napi_value) {
"test_external_arraybuffer",
test_external_arraybuffer
),
napi_new_property!(
env,
"test_static_external_buffer",
test_static_external_buffer
),
];
assert_napi_ok!(napi_define_properties(