mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-24 19:40:21 +09:00
Revert "net: dev: Convert sa_data to flexible array in struct sockaddr"
This reverts commit4d3b2bd995which is commitb5f0de6df6upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. It's not a "real" break, and we can work around it, but this really does not affect Android systems, so it's safe to drop for now. Bug: 161946584 Change-Id: Id2666dca715b44594f71e291a4c01e5b5a0e88d9 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -9097,7 +9097,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;
|
||||
|
||||
|
||||
@@ -339,7 +339,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user