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>
This commit is contained in:
parent
4f746fb495
commit
9868b5d44f
|
@ -41,6 +41,14 @@ struct can_proto {
|
||||||
struct proto *prot;
|
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) */
|
/* function prototypes for the CAN networklayer core (af_can.c) */
|
||||||
|
|
||||||
extern int can_proto_register(const struct can_proto *cp);
|
extern int can_proto_register(const struct can_proto *cp);
|
||||||
|
|
|
@ -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 */
|
/* no bound device as default => check msg_name */
|
||||||
DECLARE_SOCKADDR(struct sockaddr_can *, addr, 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;
|
return -EINVAL;
|
||||||
|
|
||||||
if (addr->can_family != AF_CAN)
|
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);
|
struct net *net = sock_net(sk);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (len < sizeof(*addr))
|
if (len < CAN_REQUIRED_SIZE(*addr, can_ifindex))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
|
|
|
@ -396,7 +396,7 @@ static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int notify_enetdown = 0;
|
int notify_enetdown = 0;
|
||||||
|
|
||||||
if (len < sizeof(*addr))
|
if (len < CAN_REQUIRED_SIZE(*addr, can_ifindex))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (addr->can_family != AF_CAN)
|
if (addr->can_family != AF_CAN)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -733,7 +733,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
|
||||||
if (msg->msg_name) {
|
if (msg->msg_name) {
|
||||||
DECLARE_SOCKADDR(struct sockaddr_can *, addr, 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;
|
return -EINVAL;
|
||||||
|
|
||||||
if (addr->can_family != AF_CAN)
|
if (addr->can_family != AF_CAN)
|
||||||
|
|
Loading…
Reference in New Issue