diff options
Diffstat (limited to 'net/unix/af_unix.c')
-rw-r--r-- | net/unix/af_unix.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 6a7fe7660551..c77ced0109b7 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -343,7 +343,7 @@ found: | |||
343 | * are still connected to it and there's no way to inform "a polling | 343 | * are still connected to it and there's no way to inform "a polling |
344 | * implementation" that it should let go of a certain wait queue | 344 | * implementation" that it should let go of a certain wait queue |
345 | * | 345 | * |
346 | * In order to propagate a wake up, a wait_queue_t of the client | 346 | * In order to propagate a wake up, a wait_queue_entry_t of the client |
347 | * socket is enqueued on the peer_wait queue of the server socket | 347 | * socket is enqueued on the peer_wait queue of the server socket |
348 | * whose wake function does a wake_up on the ordinary client socket | 348 | * whose wake function does a wake_up on the ordinary client socket |
349 | * wait queue. This connection is established whenever a write (or | 349 | * wait queue. This connection is established whenever a write (or |
@@ -352,7 +352,7 @@ found: | |||
352 | * was relayed. | 352 | * was relayed. |
353 | */ | 353 | */ |
354 | 354 | ||
355 | static int unix_dgram_peer_wake_relay(wait_queue_t *q, unsigned mode, int flags, | 355 | static int unix_dgram_peer_wake_relay(wait_queue_entry_t *q, unsigned mode, int flags, |
356 | void *key) | 356 | void *key) |
357 | { | 357 | { |
358 | struct unix_sock *u; | 358 | struct unix_sock *u; |
@@ -999,7 +999,8 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
999 | struct path path = { }; | 999 | struct path path = { }; |
1000 | 1000 | ||
1001 | err = -EINVAL; | 1001 | err = -EINVAL; |
1002 | if (sunaddr->sun_family != AF_UNIX) | 1002 | if (addr_len < offsetofend(struct sockaddr_un, sun_family) || |
1003 | sunaddr->sun_family != AF_UNIX) | ||
1003 | goto out; | 1004 | goto out; |
1004 | 1005 | ||
1005 | if (addr_len == sizeof(short)) { | 1006 | if (addr_len == sizeof(short)) { |
@@ -1110,6 +1111,10 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | |||
1110 | unsigned int hash; | 1111 | unsigned int hash; |
1111 | int err; | 1112 | int err; |
1112 | 1113 | ||
1114 | err = -EINVAL; | ||
1115 | if (alen < offsetofend(struct sockaddr, sa_family)) | ||
1116 | goto out; | ||
1117 | |||
1113 | if (addr->sa_family != AF_UNSPEC) { | 1118 | if (addr->sa_family != AF_UNSPEC) { |
1114 | err = unix_mkname(sunaddr, alen, &hash); | 1119 | err = unix_mkname(sunaddr, alen, &hash); |
1115 | if (err < 0) | 1120 | if (err < 0) |