summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKurt Van Dijck <dev.kurt@vandijck-laurijssen.be>2018-10-08 05:48:33 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2019-09-04 07:29:15 -0400
commit9868b5d44f3df9dd75247acd23dddff0a42f79be (patch)
treec12df929a819d45fab12295ea93c3c5d4d00aa10
parent4f746fb4951834ba71d590d430f27dee54f9d9a0 (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.h8
-rw-r--r--net/can/bcm.c4
-rw-r--r--net/can/raw.c4
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
46extern int can_proto_register(const struct can_proto *cp); 54extern 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)