mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(ext/ffi): don't panic on invalid enum values (#11815)
Co-authored-by: Feng Yu <f3n67u@gmail.com>
This commit is contained in:
parent
2187c11e5d
commit
df084b9f14
4 changed files with 38 additions and 33 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -3280,9 +3280,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_v8"
|
name = "serde_v8"
|
||||||
version = "0.9.0"
|
version = "0.9.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "88bf7bf03d60f6c5098d2d1867404ff50695435f638c34e4a95b8b3631cb4900"
|
checksum = "f5ce7662cda194ff443bddf146c952e83075889590838cd41df768fba7d152d0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rusty_v8",
|
"rusty_v8",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
25
cli/tests/unit/ffi_test.ts
Normal file
25
cli/tests/unit/ffi_test.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
|
import { assertThrows, unitTest } from "./test_util.ts";
|
||||||
|
|
||||||
|
unitTest(function dlopenInvalidArguments() {
|
||||||
|
const filename = "/usr/lib/libc.so.6";
|
||||||
|
assertThrows(() => {
|
||||||
|
// @ts-expect-error: ForeignFunction cannot be null
|
||||||
|
Deno.dlopen(filename, { malloc: null });
|
||||||
|
}, TypeError);
|
||||||
|
assertThrows(() => {
|
||||||
|
Deno.dlopen(filename, {
|
||||||
|
// @ts-expect-error: invalid NativeType
|
||||||
|
malloc: { parameters: ["a"], result: "b" },
|
||||||
|
});
|
||||||
|
}, TypeError);
|
||||||
|
assertThrows(() => {
|
||||||
|
// @ts-expect-error: DynamicLibrary symbols cannot be null
|
||||||
|
Deno.dlopen(filename, null);
|
||||||
|
}, TypeError);
|
||||||
|
assertThrows(() => {
|
||||||
|
// @ts-expect-error: require 2 arguments
|
||||||
|
Deno.dlopen(filename);
|
||||||
|
}, TypeError);
|
||||||
|
});
|
|
@ -25,7 +25,7 @@ pin-project = "1.0.7"
|
||||||
rusty_v8 = "0.26.0"
|
rusty_v8 = "0.26.0"
|
||||||
serde = { version = "1.0.126", features = ["derive"] }
|
serde = { version = "1.0.126", features = ["derive"] }
|
||||||
serde_json = { version = "1.0.64", features = ["preserve_order"] }
|
serde_json = { version = "1.0.64", features = ["preserve_order"] }
|
||||||
serde_v8 = { version = "0.9.0" }
|
serde_v8 = { version = "0.9.3" }
|
||||||
url = { version = "2.2.2", features = ["serde"] }
|
url = { version = "2.2.2", features = ["serde"] }
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
|
|
|
@ -75,12 +75,13 @@ impl DynamicLibraryResource {
|
||||||
) -> Result<(), AnyError> {
|
) -> Result<(), AnyError> {
|
||||||
let fn_ptr = unsafe { self.lib.symbol::<*const c_void>(&symbol) }?;
|
let fn_ptr = unsafe { self.lib.symbol::<*const c_void>(&symbol) }?;
|
||||||
let ptr = libffi::middle::CodePtr::from_ptr(fn_ptr as _);
|
let ptr = libffi::middle::CodePtr::from_ptr(fn_ptr as _);
|
||||||
let parameter_types =
|
|
||||||
foreign_fn.parameters.into_iter().map(NativeType::from);
|
|
||||||
let result_type = NativeType::from(foreign_fn.result);
|
|
||||||
let cif = libffi::middle::Cif::new(
|
let cif = libffi::middle::Cif::new(
|
||||||
parameter_types.clone().map(libffi::middle::Type::from),
|
foreign_fn
|
||||||
result_type.into(),
|
.parameters
|
||||||
|
.clone()
|
||||||
|
.into_iter()
|
||||||
|
.map(libffi::middle::Type::from),
|
||||||
|
foreign_fn.result.into(),
|
||||||
);
|
);
|
||||||
|
|
||||||
self.symbols.insert(
|
self.symbols.insert(
|
||||||
|
@ -88,8 +89,8 @@ impl DynamicLibraryResource {
|
||||||
Symbol {
|
Symbol {
|
||||||
cif,
|
cif,
|
||||||
ptr,
|
ptr,
|
||||||
parameter_types: parameter_types.collect(),
|
parameter_types: foreign_fn.parameters,
|
||||||
result_type,
|
result_type: foreign_fn.result,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -153,27 +154,6 @@ impl From<NativeType> for libffi::middle::Type {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<String> for NativeType {
|
|
||||||
fn from(string: String) -> Self {
|
|
||||||
match string.as_str() {
|
|
||||||
"void" => NativeType::Void,
|
|
||||||
"u8" => NativeType::U8,
|
|
||||||
"i8" => NativeType::I8,
|
|
||||||
"u16" => NativeType::U16,
|
|
||||||
"i16" => NativeType::I16,
|
|
||||||
"u32" => NativeType::U32,
|
|
||||||
"i32" => NativeType::I32,
|
|
||||||
"u64" => NativeType::U64,
|
|
||||||
"i64" => NativeType::I64,
|
|
||||||
"usize" => NativeType::USize,
|
|
||||||
"isize" => NativeType::ISize,
|
|
||||||
"f32" => NativeType::F32,
|
|
||||||
"f64" => NativeType::F64,
|
|
||||||
_ => unimplemented!(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
union NativeValue {
|
union NativeValue {
|
||||||
void_value: (),
|
void_value: (),
|
||||||
|
@ -279,8 +259,8 @@ fn value_as_f64(value: Value) -> f64 {
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
struct ForeignFunction {
|
struct ForeignFunction {
|
||||||
parameters: Vec<String>,
|
parameters: Vec<NativeType>,
|
||||||
result: String,
|
result: NativeType,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
|
|
Loading…
Add table
Reference in a new issue