OSDN Git Service

can: introduce CAN_REQUIRED_SIZE macro
authorKurt Van Dijck <dev.kurt@vandijck-laurijssen.be>
Mon, 8 Oct 2018 09:48:33 +0000 (11:48 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 4 Sep 2019 11:29:15 +0000 (13:29 +0200)
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>
include/linux/can/core.h
net/can/bcm.c
net/can/raw.c

index 708c10d..8339071 100644 (file)
@@ -41,6 +41,14 @@ struct can_proto {
        struct proto *prot;
 };
 
+/* required_size
+ * macro to find the minimum size of a struct
+ * that includes a requested member
+ */
+#define CAN_REQUIRED_SIZE(struct_type, member) \
+       (offsetof(typeof(struct_type), member) + \
+        sizeof(((typeof(struct_type) *)(NULL))->member))
+
 /* function prototypes for the CAN networklayer core (af_can.c) */
 
 extern int  can_proto_register(const struct can_proto *cp);
index 28fd1a1..c96fa0f 100644 (file)
@@ -1294,7 +1294,7 @@ static int bcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
                /* no bound device as default => check msg_name */
                DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
 
-               if (msg->msg_namelen < sizeof(*addr))
+               if (msg->msg_namelen < CAN_REQUIRED_SIZE(*addr, can_ifindex))
                        return -EINVAL;
 
                if (addr->can_family != AF_CAN)
@@ -1536,7 +1536,7 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
        struct net *net = sock_net(sk);
        int ret = 0;
 
-       if (len < sizeof(*addr))
+       if (len < CAN_REQUIRED_SIZE(*addr, can_ifindex))
                return -EINVAL;
 
        lock_sock(sk);
index fdbc361..59c039d 100644 (file)
@@ -396,7 +396,7 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
        int err = 0;
        int notify_enetdown = 0;
 
-       if (len < sizeof(*addr))
+       if (len < CAN_REQUIRED_SIZE(*addr, can_ifindex))
                return -EINVAL;
        if (addr->can_family != AF_CAN)
                return -EINVAL;
@@ -733,7 +733,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
        if (msg->msg_name) {
                DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
 
-               if (msg->msg_namelen < sizeof(*addr))
+               if (msg->msg_namelen < CAN_REQUIRED_SIZE(*addr, can_ifindex))
                        return -EINVAL;
 
                if (addr->can_family != AF_CAN)