Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

can: add proper checks for ifnum validity #14909

Merged
merged 5 commits into from
Oct 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cpu/esp32/include/periph_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,10 @@ typedef struct {
#define UART_NUMOF_MAX (3)
/** @} */

#ifdef MODULE_PERIPH_CAN
#include "can_esp.h"
#endif

#ifdef __cplusplus
}
#endif
Expand Down
1 change: 1 addition & 0 deletions cpu/native/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ config NATIVE_OS_DARWIN

config NATIVE_OS_LINUX
bool
select HAS_PERIPH_CAN
select HAS_PERIPH_GPIO
select HAS_PERIPH_GPIO_IRQ
select HAS_PERIPH_SPI
Expand Down
2 changes: 2 additions & 0 deletions cpu/native/Makefile.features
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ ifeq ($(OS),Linux)
FEATURES_PROVIDED += periph_spi
# Hardware GPIO access is only available on Linux hosts
FEATURES_PROVIDED += periph_gpio periph_gpio_irq
# CAN is only supported on Linux through socketCAN
FEATURES_PROVIDED += periph_can
endif
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
* @author Vincent Dupont <vincent@otakeys.com>
*/

#ifndef CANDEV_LINUX_PARAMS_H
#define CANDEV_LINUX_PARAMS_H
#ifndef CAN_PARAMS_H
#define CAN_PARAMS_H

#include "candev_linux.h"
#include "can/device.h"
Expand All @@ -29,7 +29,7 @@ extern "C" {
/**
* @brief Default parameters (device names)
*/
static candev_params_t candev_linux_params[] = {
static const candev_params_t candev_params[] = {
{ .name = "can0", },
{ .name = "can1", },
};
Expand All @@ -38,5 +38,5 @@ static candev_params_t candev_linux_params[] = {
}
#endif

#endif /* CANDEV_LINUX_PARAMS_H */
#endif /* CAN_PARAMS_H */
/** @} */
24 changes: 10 additions & 14 deletions cpu/native/include/candev_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,13 @@ extern "C" {
/**
* Linux candev configuration
*/
typedef struct candev_linux_conf {
typedef struct candev_conf {
/** local interface name */
char interface_name[CAN_MAX_SIZE_INTERFACE_NAME + 1];
} candev_linux_conf_t;
} can_conf_t;

/** CAN device configuration type can_conf_t is redefined by native CAN */
#define HAVE_CAN_CONF_T

#ifndef CANDEV_LINUX_MAX_FILTERS_RX
/**
Expand Down Expand Up @@ -74,25 +77,18 @@ typedef struct candev_linux_conf {
typedef struct candev_linux {
candev_t candev; /**< candev base structure */
int sock; /**< local socket id */
const candev_linux_conf_t *conf; /**< device configuration */
const can_conf_t *conf; /**< device configuration */
/** filter list */
struct can_filter filters[CANDEV_LINUX_MAX_FILTERS_RX];
} candev_linux_t;
} can_t;

/**
* @brief Device specific initialization function
*
* @param[inout] dev the device to initialize
* @param[in] conf the device configuration
*
* @return 0 on success
*/
int candev_linux_init(candev_linux_t *dev, const candev_linux_conf_t *conf);
/** CAN device type can_t is redefined by native CAN */
#define HAVE_CAN_T

/**
* @brief Array containing socketCAN device names
*/
extern candev_linux_conf_t candev_linux_conf[CAN_DLL_NUMOF];
extern can_conf_t candev_conf[CAN_DLL_NUMOF];

#endif /* defined(__linux__) */

Expand Down
4 changes: 4 additions & 0 deletions cpu/native/include/periph_cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@ typedef enum {
#endif
/** @} */

#ifdef MODULE_PERIPH_CAN
#include "candev_linux.h"
#endif

#ifdef __cplusplus
}
#endif
Expand Down
26 changes: 13 additions & 13 deletions cpu/native/can/candev_linux.c → cpu/native/periph/can.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ static int _remove_filter(candev_t *candev, const struct can_filter *filter);
static int _power_up(candev_t *candev);
static int _power_down(candev_t *candev);

static int _set_bittiming(candev_linux_t *dev, struct can_bittiming *bittiming);
static int _set_bittiming(can_t *dev, struct can_bittiming *bittiming);

static const candev_driver_t candev_linux_driver = {
.send = _send,
Expand All @@ -69,7 +69,7 @@ static const candev_driver_t candev_linux_driver = {
static candev_event_t _can_error_to_can_evt(struct can_frame can_frame_err);
static void _callback_can_sigio(int sock, void *arg);

candev_linux_conf_t candev_linux_conf[CAN_DLL_NUMOF] = {
can_conf_t candev_conf[CAN_DLL_NUMOF] = {
#if CAN_DLL_NUMOF >= 1
{
.interface_name = "vcan0",
Expand All @@ -82,9 +82,9 @@ candev_linux_conf_t candev_linux_conf[CAN_DLL_NUMOF] = {
#endif
};

int candev_linux_init(candev_linux_t *dev, const candev_linux_conf_t *conf)
int can_init(can_t *dev, const can_conf_t *conf)
{
memset(dev, 0, sizeof(candev_linux_t));
memset(dev, 0, sizeof(can_t));
dev->candev.driver = &candev_linux_driver;
dev->conf = conf;
dev->candev.bittiming.bitrate = CANDEV_LINUX_DEFAULT_BITRATE;
Expand Down Expand Up @@ -129,7 +129,7 @@ static candev_event_t _can_error_to_can_evt(struct can_frame can_frame_err)
static void _callback_can_sigio(int sockfd, void *arg)
{
(void) sockfd;
candev_linux_t *dev = (candev_linux_t *) arg;
can_t *dev = (can_t *) arg;

if (dev->candev.event_callback) {
dev->candev.event_callback(&dev->candev, CANDEV_EVENT_ISR, NULL);
Expand All @@ -149,7 +149,7 @@ static int _init(candev_t *candev)
int ret;

DEBUG("Will start linux CAN init\n");
candev_linux_t *dev = (candev_linux_t *)candev;
can_t *dev = (can_t *)candev;

if ((strlen(dev->conf->interface_name) == 0)
|| (strlen(dev->conf->interface_name) > CAN_MAX_SIZE_INTERFACE_NAME)) {
Expand Down Expand Up @@ -212,7 +212,7 @@ static int _init(candev_t *candev)
static int _send(candev_t *candev, const struct can_frame *frame)
{
int nbytes;
candev_linux_t *dev = (candev_linux_t *)candev;
can_t *dev = (can_t *)candev;

nbytes = real_write(dev->sock, frame, sizeof(struct can_frame));

Expand All @@ -232,7 +232,7 @@ static void _isr(candev_t *candev)
{
int nbytes;
struct can_frame rcv_frame;
candev_linux_t *dev = (candev_linux_t *)candev;
can_t *dev = (can_t *)candev;

if (dev == NULL) {
return;
Expand Down Expand Up @@ -272,7 +272,7 @@ static void _isr(candev_t *candev)

}

static int _set_bittiming(candev_linux_t *dev, struct can_bittiming *bittiming)
static int _set_bittiming(can_t *dev, struct can_bittiming *bittiming)
{
int res;

Expand Down Expand Up @@ -300,7 +300,7 @@ static int _set_bittiming(candev_linux_t *dev, struct can_bittiming *bittiming)

static int _set(candev_t *candev, canopt_t opt, void *value, size_t value_len)
{
candev_linux_t *dev = (candev_linux_t *) candev;
can_t *dev = (can_t *) candev;
int res = 0;

switch (opt) {
Expand Down Expand Up @@ -349,7 +349,7 @@ static int _set(candev_t *candev, canopt_t opt, void *value, size_t value_len)

static int _get(candev_t *candev, canopt_t opt, void *value, size_t max_len)
{
candev_linux_t *dev = (candev_linux_t *) candev;
can_t *dev = (can_t *) candev;
int res = 0;

switch (opt) {
Expand Down Expand Up @@ -456,7 +456,7 @@ static int _get(candev_t *candev, canopt_t opt, void *value, size_t max_len)

static int _set_filter(candev_t *candev, const struct can_filter *filter)
{
candev_linux_t *dev = (candev_linux_t *)candev;
can_t *dev = (can_t *)candev;

if (filter == NULL) {
DEBUG("candev_native: _set_filter: error filter NULL\n");
Expand Down Expand Up @@ -500,7 +500,7 @@ static int _set_filter(candev_t *candev, const struct can_filter *filter)

static int _remove_filter(candev_t *candev, const struct can_filter *filter)
{
candev_linux_t *dev = (candev_linux_t *)candev;
can_t *dev = (can_t *)candev;

if (filter == NULL) {
DEBUG("candev_native: _remove_filter: error filter NULL\n");
Expand Down
2 changes: 1 addition & 1 deletion cpu/native/startup.c
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ __attribute__((constructor)) static void startup(int argc, char **argv, char **e
usage_exit(EXIT_FAILURE);
}
optarg++;
strncpy(candev_linux_conf[i].interface_name, optarg,
strncpy(candev_conf[i].interface_name, optarg,
CAN_MAX_SIZE_INTERFACE_NAME);
}
break;
Expand Down
5 changes: 5 additions & 0 deletions cpu/stm32/Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,9 @@ ifneq (,$(filter stm32_eth,$(USEMODULE)))
USEMODULE += xtimer
endif

ifneq (,$(filter periph_can,$(FEATURES_USED)))
FEATURES_REQUIRED += periph_gpio
FEATURES_REQUIRED += periph_gpio_irq
endif

include $(RIOTCPU)/cortexm_common/Makefile.dep
53 changes: 0 additions & 53 deletions sys/auto_init/can/auto_init_can_linux.c

This file was deleted.

1 change: 1 addition & 0 deletions sys/auto_init/can/auto_init_periph_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* @}
*/

#include "periph/can.h"
#include "can/device.h"
#include "can_params.h"

Expand Down
5 changes: 0 additions & 5 deletions sys/auto_init/can/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,6 @@ void auto_init_candev(void)
isotp_init(isotp_stack, ISOTP_STACK_SIZE, ISOTP_PRIORITY, "isotp");
#endif

#ifdef MODULE_CAN_LINUX
extern void auto_init_can_native(void);
auto_init_can_native();
#endif

#ifdef MODULE_PERIPH_CAN
extern void auto_init_periph_can(void);
auto_init_periph_can();
Expand Down
23 changes: 19 additions & 4 deletions sys/can/conn/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ int conn_can_raw_create(conn_can_raw_t *conn, struct can_filter *filter, size_t
int ifnum, int flags)
{
assert(conn != NULL);
assert(ifnum < CAN_DLL_NUMOF);
if (ifnum < 0 || ifnum >= CAN_DLL_NUMOF) {
memset(conn, 0, sizeof (*conn));
conn->ifnum = -1;
return -ENODEV;
}

DEBUG("conn_can_raw_create: create conn=%p, ifnum=%d flags=%d\n", (void *)conn, ifnum, flags);

Expand Down Expand Up @@ -121,7 +125,11 @@ static void _tx_conf_timeout(void *arg)
int conn_can_raw_send(conn_can_raw_t *conn, const struct can_frame *frame, int flags)
{
assert(conn != NULL);
assert(conn->ifnum < CAN_DLL_NUMOF);

if (conn->ifnum < 0 || conn->ifnum >= CAN_DLL_NUMOF) {
return -ENODEV;
}

assert((conn->flags & CONN_CAN_RECVONLY) == 0);
assert(frame != NULL);

Expand Down Expand Up @@ -201,7 +209,11 @@ static void _rx_timeout(void *arg)
int conn_can_raw_recv(conn_can_raw_t *conn, struct can_frame *frame, uint32_t timeout)
{
assert(conn != NULL);
assert(conn->ifnum < CAN_DLL_NUMOF);

if (conn->ifnum < 0 || conn->ifnum >= CAN_DLL_NUMOF) {
return -ENODEV;
}

assert(frame != NULL);

xtimer_t timer;
Expand Down Expand Up @@ -256,7 +268,10 @@ int conn_can_raw_recv(conn_can_raw_t *conn, struct can_frame *frame, uint32_t ti
int conn_can_raw_close(conn_can_raw_t *conn)
{
assert(conn != NULL);
assert(conn->ifnum < CAN_DLL_NUMOF);

if (conn->ifnum < 0 || conn->ifnum >= CAN_DLL_NUMOF) {
return -ENODEV;
}

DEBUG("conn_can_raw_close: conn=%p\n", (void *)conn);

Expand Down
4 changes: 3 additions & 1 deletion sys/can/dll.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,9 @@ int raw_can_power_up(int ifnum)

int raw_can_set_bitrate(int ifnum, uint32_t bitrate, uint32_t sample_point)
{
assert(ifnum < candev_nb);
if (ifnum < 0 || ifnum >= candev_nb) {
return -1;
}

int res = 0;
int ret;
Expand Down
Loading