mirror of
https://github.com/denoland/deno.git
synced 2024-11-26 16:09:27 -05:00
fix(ext/ffi): Empty buffers error with index out of bounds on FFI (#14997)
This commit is contained in:
parent
e3b40ae0ea
commit
825477b3cd
3 changed files with 24 additions and 6 deletions
|
@ -810,12 +810,16 @@ where
|
|||
)
|
||||
})?
|
||||
.get_backing_store();
|
||||
let pointer = &backing_store[byte_offset] as *const _ as *const u8;
|
||||
let pointer = if byte_offset > 0 {
|
||||
&backing_store[byte_offset..] as *const _ as *const u8
|
||||
} else {
|
||||
&backing_store[..] as *const _ as *const u8
|
||||
};
|
||||
ffi_args.push(NativeValue { pointer });
|
||||
} else if let Ok(value) = v8::Local::<v8::ArrayBuffer>::try_from(value)
|
||||
{
|
||||
let backing_store = value.get_backing_store();
|
||||
let pointer = &backing_store as *const _ as *const u8;
|
||||
let pointer = &backing_store[..] as *const _ as *const u8;
|
||||
ffi_args.push(NativeValue { pointer });
|
||||
} else {
|
||||
return Err(type_error("Invalid FFI pointer type, expected null, BigInt, ArrayBuffer, or ArrayBufferView"));
|
||||
|
@ -995,13 +999,17 @@ where
|
|||
)
|
||||
})?
|
||||
.get_backing_store();
|
||||
let pointer = &backing_store[byte_offset] as *const _ as *const u8;
|
||||
let pointer = if byte_offset > 0 {
|
||||
&backing_store[byte_offset..] as *const _ as *const u8
|
||||
} else {
|
||||
&backing_store[..] as *const _ as *const u8
|
||||
};
|
||||
|
||||
ffi_args.push(NativeValue { pointer });
|
||||
} else if let Ok(value) = v8::Local::<v8::ArrayBuffer>::try_from(value)
|
||||
{
|
||||
let backing_store = value.get_backing_store();
|
||||
let pointer = &backing_store as *const _ as *const u8;
|
||||
let pointer = &backing_store[..] as *const _ as *const u8;
|
||||
|
||||
ffi_args.push(NativeValue { pointer });
|
||||
} else {
|
||||
|
@ -1367,11 +1375,15 @@ unsafe fn do_ffi_callback(
|
|||
.buffer(&mut scope)
|
||||
.expect("Unable to deserialize result parameter.")
|
||||
.get_backing_store();
|
||||
let pointer = &backing_store[byte_offset] as *const _ as *const u8;
|
||||
let pointer = if byte_offset > 0 {
|
||||
&backing_store[byte_offset..] as *const _ as *const u8
|
||||
} else {
|
||||
&backing_store[..] as *const _ as *const u8
|
||||
};
|
||||
*(result as *mut *const u8) = pointer;
|
||||
} else if let Ok(value) = v8::Local::<v8::ArrayBuffer>::try_from(value) {
|
||||
let backing_store = value.get_backing_store();
|
||||
let pointer = &backing_store as *const _ as *const u8;
|
||||
let pointer = &backing_store[..] as *const _ as *const u8;
|
||||
*(result as *mut *const u8) = pointer;
|
||||
} else if let Ok(value) = v8::Local::<v8::BigInt>::try_from(value) {
|
||||
*(result as *mut u64) = value.u64_value().0;
|
||||
|
|
|
@ -56,6 +56,8 @@ fn basic() {
|
|||
false\n\
|
||||
true\n\
|
||||
false\n\
|
||||
false\n\
|
||||
false\n\
|
||||
579\n\
|
||||
true\n\
|
||||
579\n\
|
||||
|
|
|
@ -214,6 +214,10 @@ console.log(stringPtrview.getCString(11));
|
|||
console.log(Boolean(dylib.symbols.is_null_ptr(ptr0)));
|
||||
console.log(Boolean(dylib.symbols.is_null_ptr(null)));
|
||||
console.log(Boolean(dylib.symbols.is_null_ptr(Deno.UnsafePointer.of(into))));
|
||||
const emptyBuffer = new BigUint64Array(0);
|
||||
console.log(Boolean(dylib.symbols.is_null_ptr(emptyBuffer)));
|
||||
const emptySlice = into.subarray(6);
|
||||
console.log(Boolean(dylib.symbols.is_null_ptr(emptySlice)));
|
||||
|
||||
const addU32Ptr = dylib.symbols.get_add_u32_ptr();
|
||||
const addU32 = new Deno.UnsafeFnPointer(addU32Ptr, {
|
||||
|
|
Loading…
Reference in a new issue