|
@@ -3103,7 +3103,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,
|
|
int addr_len)
|
|
int addr_len)
|
|
{
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
struct sock *sk = sock->sk;
|
|
- char name[15];
|
|
|
|
|
|
+ char name[sizeof(uaddr->sa_data) + 1];
|
|
|
|
|
|
/*
|
|
/*
|
|
* Check legality
|
|
* Check legality
|
|
@@ -3111,7 +3111,11 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,
|
|
|
|
|
|
if (addr_len != sizeof(struct sockaddr))
|
|
if (addr_len != sizeof(struct sockaddr))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
- strlcpy(name, uaddr->sa_data, sizeof(name));
|
|
|
|
|
|
+ /* uaddr->sa_data comes from the userspace, it's not guaranteed to be
|
|
|
|
+ * zero-terminated.
|
|
|
|
+ */
|
|
|
|
+ memcpy(name, uaddr->sa_data, sizeof(uaddr->sa_data));
|
|
|
|
+ name[sizeof(uaddr->sa_data)] = 0;
|
|
|
|
|
|
return packet_do_bind(sk, name, 0, pkt_sk(sk)->num);
|
|
return packet_do_bind(sk, name, 0, pkt_sk(sk)->num);
|
|
}
|
|
}
|