diff options
Diffstat (limited to 'net/tipc/socket.c')
| -rw-r--r-- | net/tipc/socket.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 83f466e57fea..c8341d1f995e 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -351,7 +351,7 @@ static int release(struct socket *sock) | |||
| 351 | * Delete TIPC port; this ensures no more messages are queued | 351 | * Delete TIPC port; this ensures no more messages are queued |
| 352 | * (also disconnects an active connection & sends a 'FIN-' to peer) | 352 | * (also disconnects an active connection & sends a 'FIN-' to peer) |
| 353 | */ | 353 | */ |
| 354 | res = tipc_deleteport(tport->ref); | 354 | res = tipc_deleteport(tport); |
| 355 | 355 | ||
| 356 | /* Discard any remaining (connection-based) messages in receive queue */ | 356 | /* Discard any remaining (connection-based) messages in receive queue */ |
| 357 | __skb_queue_purge(&sk->sk_receive_queue); | 357 | __skb_queue_purge(&sk->sk_receive_queue); |
| @@ -383,30 +383,46 @@ static int release(struct socket *sock) | |||
| 383 | */ | 383 | */ |
| 384 | static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len) | 384 | static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len) |
| 385 | { | 385 | { |
| 386 | struct sock *sk = sock->sk; | ||
| 386 | struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; | 387 | struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; |
| 387 | u32 portref = tipc_sk_port(sock->sk)->ref; | 388 | struct tipc_port *tport = tipc_sk_port(sock->sk); |
| 389 | int res = -EINVAL; | ||
| 388 | 390 | ||
| 389 | if (unlikely(!uaddr_len)) | 391 | lock_sock(sk); |
| 390 | return tipc_withdraw(portref, 0, NULL); | 392 | if (unlikely(!uaddr_len)) { |
| 393 | res = tipc_withdraw(tport, 0, NULL); | ||
| 394 | goto exit; | ||
| 395 | } | ||
| 391 | 396 | ||
| 392 | if (uaddr_len < sizeof(struct sockaddr_tipc)) | 397 | if (uaddr_len < sizeof(struct sockaddr_tipc)) { |
| 393 | return -EINVAL; | 398 | res = -EINVAL; |
| 394 | if (addr->family != AF_TIPC) | 399 | goto exit; |
| 395 | return -EAFNOSUPPORT; | 400 | } |
| 401 | if (addr->family != AF_TIPC) { | ||
| 402 | res = -EAFNOSUPPORT; | ||
| 403 | goto exit; | ||
| 404 | } | ||
| 396 | 405 | ||
| 397 | if (addr->addrtype == TIPC_ADDR_NAME) | 406 | if (addr->addrtype == TIPC_ADDR_NAME) |
| 398 | addr->addr.nameseq.upper = addr->addr.nameseq.lower; | 407 | addr->addr.nameseq.upper = addr->addr.nameseq.lower; |
| 399 | else if (addr->addrtype != TIPC_ADDR_NAMESEQ) | 408 | else if (addr->addrtype != TIPC_ADDR_NAMESEQ) { |
| 400 | return -EAFNOSUPPORT; | 409 | res = -EAFNOSUPPORT; |
| 410 | goto exit; | ||
| 411 | } | ||
| 401 | 412 | ||
| 402 | if ((addr->addr.nameseq.type < TIPC_RESERVED_TYPES) && | 413 | if ((addr->addr.nameseq.type < TIPC_RESERVED_TYPES) && |
| 403 | (addr->addr.nameseq.type != TIPC_TOP_SRV) && | 414 | (addr->addr.nameseq.type != TIPC_TOP_SRV) && |
| 404 | (addr->addr.nameseq.type != TIPC_CFG_SRV)) | 415 | (addr->addr.nameseq.type != TIPC_CFG_SRV)) { |
| 405 | return -EACCES; | 416 | res = -EACCES; |
| 417 | goto exit; | ||
| 418 | } | ||
| 406 | 419 | ||
| 407 | return (addr->scope > 0) ? | 420 | res = (addr->scope > 0) ? |
| 408 | tipc_publish(portref, addr->scope, &addr->addr.nameseq) : | 421 | tipc_publish(tport, addr->scope, &addr->addr.nameseq) : |
| 409 | tipc_withdraw(portref, -addr->scope, &addr->addr.nameseq); | 422 | tipc_withdraw(tport, -addr->scope, &addr->addr.nameseq); |
| 423 | exit: | ||
| 424 | release_sock(sk); | ||
| 425 | return res; | ||
| 410 | } | 426 | } |
| 411 | 427 | ||
| 412 | /** | 428 | /** |
| @@ -751,13 +767,10 @@ static int send_stream(struct kiocb *iocb, struct socket *sock, | |||
| 751 | 767 | ||
| 752 | /* Handle special cases where there is no connection */ | 768 | /* Handle special cases where there is no connection */ |
| 753 | if (unlikely(sock->state != SS_CONNECTED)) { | 769 | if (unlikely(sock->state != SS_CONNECTED)) { |
| 754 | res = -ENOTCONN; | ||
| 755 | |||
| 756 | if (sock->state == SS_UNCONNECTED) | 770 | if (sock->state == SS_UNCONNECTED) |
| 757 | res = send_packet(NULL, sock, m, total_len); | 771 | res = send_packet(NULL, sock, m, total_len); |
| 758 | else if (sock->state == SS_DISCONNECTING) | 772 | else |
| 759 | res = -EPIPE; | 773 | res = sock->state == SS_DISCONNECTING ? -EPIPE : -ENOTCONN; |
| 760 | |||
| 761 | goto exit; | 774 | goto exit; |
| 762 | } | 775 | } |
| 763 | 776 | ||
