diff options
author | Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be> | 2018-10-08 05:48:33 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2019-09-04 07:29:15 -0400 |
commit | 9868b5d44f3df9dd75247acd23dddff0a42f79be (patch) | |
tree | c12df929a819d45fab12295ea93c3c5d4d00aa10 | |
parent | 4f746fb4951834ba71d590d430f27dee54f9d9a0 (diff) |
can: introduce CAN_REQUIRED_SIZE macro
The size of this structure will be increased with J1939 support. To stay
binary compatible, the CAN_REQUIRED_SIZE macro is introduced for
existing CAN protocols.
Signed-off-by: Kurt Van Dijck <dev.kurt@vandijck-laurijssen.be>
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
-rw-r--r-- | include/linux/can/core.h | 8 | ||||
-rw-r--r-- | net/can/bcm.c | 4 | ||||
-rw-r--r-- | net/can/raw.c | 4 |
3 files changed, 12 insertions, 4 deletions
diff --git a/include/linux/can/core.h b/include/linux/can/core.h index 708c10d3417a..8339071ab08b 100644 --- a/include/linux/can/core.h +++ b/include/linux/can/core.h | |||
@@ -41,6 +41,14 @@ struct can_proto { | |||
41 | struct proto *prot; | 41 | struct proto *prot; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | /* required_size | ||
45 | * macro to find the minimum size of a struct | ||
46 | * that includes a requested member | ||
47 | */ | ||
48 | #define CAN_REQUIRED_SIZE(struct_type, member) \ | ||
49 | (offsetof(typeof(struct_type), member) + \ | ||
50 | sizeof(((typeof(struct_type) *)(NULL))->member)) | ||
51 | |||
44 | /* function prototypes for the CAN networklayer core (af_can.c) */ | 52 | /* function prototypes for the CAN networklayer core (af_can.c) */ |
45 | 53 | ||
46 | extern int can_proto_register(const struct can_proto *cp); | 54 | extern int can_proto_register(const struct can_proto *cp); |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 28fd1a1c8487..c96fa0f33db3 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -1294,7 +1294,7 @@ static int bcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
1294 | /* no bound device as default => check msg_name */ | 1294 | /* no bound device as default => check msg_name */ |
1295 | DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name); | 1295 | DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name); |
1296 | 1296 | ||
1297 | if (msg->msg_namelen < sizeof(*addr)) | 1297 | if (msg->msg_namelen < CAN_REQUIRED_SIZE(*addr, can_ifindex)) |
1298 | return -EINVAL; | 1298 | return -EINVAL; |
1299 | 1299 | ||
1300 | if (addr->can_family != AF_CAN) | 1300 | if (addr->can_family != AF_CAN) |
@@ -1536,7 +1536,7 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len, | |||
1536 | struct net *net = sock_net(sk); | 1536 | struct net *net = sock_net(sk); |
1537 | int ret = 0; | 1537 | int ret = 0; |
1538 | 1538 | ||
1539 | if (len < sizeof(*addr)) | 1539 | if (len < CAN_REQUIRED_SIZE(*addr, can_ifindex)) |
1540 | return -EINVAL; | 1540 | return -EINVAL; |
1541 | 1541 | ||
1542 | lock_sock(sk); | 1542 | lock_sock(sk); |
diff --git a/net/can/raw.c b/net/can/raw.c index fdbc36140e9b..59c039d73c6d 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -396,7 +396,7 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len) | |||
396 | int err = 0; | 396 | int err = 0; |
397 | int notify_enetdown = 0; | 397 | int notify_enetdown = 0; |
398 | 398 | ||
399 | if (len < sizeof(*addr)) | 399 | if (len < CAN_REQUIRED_SIZE(*addr, can_ifindex)) |
400 | return -EINVAL; | 400 | return -EINVAL; |
401 | if (addr->can_family != AF_CAN) | 401 | if (addr->can_family != AF_CAN) |
402 | return -EINVAL; | 402 | return -EINVAL; |
@@ -733,7 +733,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
733 | if (msg->msg_name) { | 733 | if (msg->msg_name) { |
734 | DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name); | 734 | DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name); |
735 | 735 | ||
736 | if (msg->msg_namelen < sizeof(*addr)) | 736 | if (msg->msg_namelen < CAN_REQUIRED_SIZE(*addr, can_ifindex)) |
737 | return -EINVAL; | 737 | return -EINVAL; |
738 | 738 | ||
739 | if (addr->can_family != AF_CAN) | 739 | if (addr->can_family != AF_CAN) |