diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2009-03-11 14:06:41 -0400 |
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2009-03-11 14:06:41 -0400 |
| commit | fba91afbec2c004e2c8733ae9e0ca6998e962c64 (patch) | |
| tree | 025d7c07b8d41d4e5752fb9da7396a0b596856da | |
| parent | d7371c41b0cda782256b1df759df4e8d4724584c (diff) | |
SUNRPC: Fix an Oops due to socket not set up yet...
We can Oops in both xs_udp_send_request() and xs_tcp_send_request() if the
call to xs_sendpages() returns an error due to the socket not yet being
set up.
Deal with that situation by returning a new error: ENOTSOCK, so that we
know to avoid dereferencing transport->sock.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | net/sunrpc/xprtsock.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 5cbb404c4cd..a71fefd6191 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -467,7 +467,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, | |||
| 467 | int err, sent = 0; | 467 | int err, sent = 0; |
| 468 | 468 | ||
| 469 | if (unlikely(!sock)) | 469 | if (unlikely(!sock)) |
| 470 | return -ENOTCONN; | 470 | return -ENOTSOCK; |
| 471 | 471 | ||
| 472 | clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags); | 472 | clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags); |
| 473 | if (base != 0) { | 473 | if (base != 0) { |
| @@ -594,6 +594,10 @@ static int xs_udp_send_request(struct rpc_task *task) | |||
| 594 | } | 594 | } |
| 595 | 595 | ||
| 596 | switch (status) { | 596 | switch (status) { |
| 597 | case -ENOTSOCK: | ||
| 598 | status = -ENOTCONN; | ||
| 599 | /* Should we call xs_close() here? */ | ||
| 600 | break; | ||
| 597 | case -EAGAIN: | 601 | case -EAGAIN: |
| 598 | xs_nospace(task); | 602 | xs_nospace(task); |
| 599 | break; | 603 | break; |
| @@ -693,6 +697,10 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
| 693 | } | 697 | } |
| 694 | 698 | ||
| 695 | switch (status) { | 699 | switch (status) { |
| 700 | case -ENOTSOCK: | ||
| 701 | status = -ENOTCONN; | ||
| 702 | /* Should we call xs_close() here? */ | ||
| 703 | break; | ||
| 696 | case -EAGAIN: | 704 | case -EAGAIN: |
| 697 | xs_nospace(task); | 705 | xs_nospace(task); |
| 698 | break; | 706 | break; |
