drivers: can: handlers: copy outbound argument structs

Pass a copy of outbound argument structs to the implementation functions
as recommended for Zephyr system calls.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
This commit is contained in:
Henrik Brix Andersen 2022-04-03 12:21:02 +02:00 committed by Carles Cufí
commit 9f4bb75af6

View file

@ -129,13 +129,13 @@ static inline int z_vrfy_can_send(const struct device *dev,
can_tx_callback_t callback, can_tx_callback_t callback,
void *user_data) void *user_data)
{ {
Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, send)); struct zcan_frame frame_copy;
Z_OOPS(Z_SYSCALL_MEMORY_READ(frame, sizeof(*frame))); Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, send));
Z_OOPS(Z_SYSCALL_MEMORY_READ(frame->data, sizeof(frame->data))); Z_OOPS(z_user_from_copy(&frame_copy, frame, sizeof(frame_copy)));
Z_OOPS(Z_SYSCALL_VERIFY_MSG(callback == NULL, "callbacks may not be set from user mode")); Z_OOPS(Z_SYSCALL_VERIFY_MSG(callback == NULL, "callbacks may not be set from user mode"));
return z_impl_can_send(dev, frame, timeout, callback, user_data); return z_impl_can_send(dev, &frame_copy, timeout, callback, user_data);
} }
#include <syscalls/can_send_mrsh.c> #include <syscalls/can_send_mrsh.c>
@ -143,11 +143,13 @@ static inline int z_vrfy_can_add_rx_filter_msgq(const struct device *dev,
struct k_msgq *msgq, struct k_msgq *msgq,
const struct zcan_filter *filter) const struct zcan_filter *filter)
{ {
struct zcan_filter filter_copy;
Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, add_rx_filter)); Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, add_rx_filter));
Z_OOPS(Z_SYSCALL_OBJ(msgq, K_OBJ_MSGQ)); Z_OOPS(Z_SYSCALL_OBJ(msgq, K_OBJ_MSGQ));
Z_OOPS(Z_SYSCALL_MEMORY_READ(filter, sizeof(*filter))); Z_OOPS(z_user_from_copy(&filter_copy, filter, sizeof(filter_copy)));
return z_impl_can_add_rx_filter_msgq(dev, msgq, filter); return z_impl_can_add_rx_filter_msgq(dev, msgq, &filter_copy);
} }
#include <syscalls/can_add_rx_filter_msgq_mrsh.c> #include <syscalls/can_add_rx_filter_msgq_mrsh.c>