Skip to content

Commit

Permalink
Avoid calling slice::from_raw_parts with a null pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
saethlin authored and davidhewitt committed Oct 30, 2022
1 parent b6f17aa commit 8088af3
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 2 deletions.
1 change: 1 addition & 0 deletions newsfragments/2687.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix UB in `FunctionDescription::extract_arguments_fastcall` due to creating slices from a null pointer.
8 changes: 6 additions & 2 deletions src/impl_/extract_argument.rs
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ impl FunctionDescription {
/// Equivalent of `extract_arguments_tuple_dict` which uses the Python C-API "fastcall" convention.
///
/// # Safety
/// - `args` must be a pointer to a C-style array of valid `ffi::PyObject` pointers.
/// - `args` must be a pointer to a C-style array of valid `ffi::PyObject` pointers, or NULL.
/// - `kwnames` must be a pointer to a PyTuple, or NULL.
/// - `nargs + kwnames.len()` is the total length of the `args` array.
#[cfg(not(Py_LIMITED_API))]
Expand All @@ -240,7 +240,11 @@ impl FunctionDescription {
// Safety: Option<&PyAny> has the same memory layout as `*mut ffi::PyObject`
let args = args as *const Option<&PyAny>;
let positional_args_provided = nargs as usize;
let args_slice = std::slice::from_raw_parts(args, positional_args_provided);
let args_slice = if args.is_null() {
&[]
} else {
std::slice::from_raw_parts(args, positional_args_provided)
};

let num_positional_parameters = self.positional_parameter_names.len();

Expand Down

0 comments on commit 8088af3

Please sign in to comment.