Revert "net: dev: Convert sa_data to flexible array in struct sockaddr"
This reverts commit f6ce90567e
which is
commit b5f0de6df6dce8d641ef58ef7012f3304dffb9a1 upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: I809e53c4e3449a45ecd1fdec260986011b88206e
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
bb807b14f3
commit
92a0d7e20f
@ -31,10 +31,7 @@ typedef __kernel_sa_family_t sa_family_t;
|
||||
|
||||
struct sockaddr {
|
||||
sa_family_t sa_family; /* address family, AF_xxx */
|
||||
union {
|
||||
char sa_data_min[14]; /* Minimum 14 bytes of protocol address */
|
||||
DECLARE_FLEX_ARRAY(char, sa_data);
|
||||
};
|
||||
char sa_data[14]; /* 14 bytes of protocol address */
|
||||
};
|
||||
|
||||
struct linger {
|
||||
|
@ -8792,7 +8792,7 @@ EXPORT_SYMBOL(dev_set_mac_address_user);
|
||||
|
||||
int dev_get_mac_address(struct sockaddr *sa, struct net *net, char *dev_name)
|
||||
{
|
||||
size_t size = sizeof(sa->sa_data_min);
|
||||
size_t size = sizeof(sa->sa_data);
|
||||
struct net_device *dev;
|
||||
int ret = 0;
|
||||
|
||||
|
@ -245,7 +245,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)
|
||||
if (ifr->ifr_hwaddr.sa_family != dev->type)
|
||||
return -EINVAL;
|
||||
memcpy(dev->broadcast, ifr->ifr_hwaddr.sa_data,
|
||||
min(sizeof(ifr->ifr_hwaddr.sa_data_min),
|
||||
min(sizeof(ifr->ifr_hwaddr.sa_data),
|
||||
(size_t)dev->addr_len));
|
||||
call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
|
||||
return 0;
|
||||
|
@ -3252,7 +3252,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,
|
||||
int addr_len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
char name[sizeof(uaddr->sa_data_min) + 1];
|
||||
char name[sizeof(uaddr->sa_data) + 1];
|
||||
|
||||
/*
|
||||
* Check legality
|
||||
@ -3263,8 +3263,8 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,
|
||||
/* uaddr->sa_data comes from the userspace, it's not guaranteed to be
|
||||
* zero-terminated.
|
||||
*/
|
||||
memcpy(name, uaddr->sa_data, sizeof(uaddr->sa_data_min));
|
||||
name[sizeof(uaddr->sa_data_min)] = 0;
|
||||
memcpy(name, uaddr->sa_data, sizeof(uaddr->sa_data));
|
||||
name[sizeof(uaddr->sa_data)] = 0;
|
||||
|
||||
return packet_do_bind(sk, name, 0, 0);
|
||||
}
|
||||
@ -3536,11 +3536,11 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
uaddr->sa_family = AF_PACKET;
|
||||
memset(uaddr->sa_data, 0, sizeof(uaddr->sa_data_min));
|
||||
memset(uaddr->sa_data, 0, sizeof(uaddr->sa_data));
|
||||
rcu_read_lock();
|
||||
dev = dev_get_by_index_rcu(sock_net(sk), READ_ONCE(pkt_sk(sk)->ifindex));
|
||||
if (dev)
|
||||
strscpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data_min));
|
||||
strscpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
|
||||
rcu_read_unlock();
|
||||
|
||||
return sizeof(*uaddr);
|
||||
|
Loading…
Reference in New Issue
Block a user