summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Yasevich <vladislav.yasevich@hp.com>2007-07-03 12:47:40 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-07-05 17:40:11 -0700
commitf50f95cab735ebe2993e8d1549f0615bad05f3f2 (patch)
tree4cbb7f7df0c50c35554a0cbfd58413894bae72c8
parent3663c306609a9322a484fba28b3da66142c50ee9 (diff)
downloadlinux-3.10-f50f95cab735ebe2993e8d1549f0615bad05f3f2.tar.gz
linux-3.10-f50f95cab735ebe2993e8d1549f0615bad05f3f2.tar.bz2
linux-3.10-f50f95cab735ebe2993e8d1549f0615bad05f3f2.zip
SCTP: Check to make sure file is valid before setting timeout
In-kernel sockets created with sock_create_kern don't usually have a file and file descriptor allocated to them. As a result, when SCTP tries to check the non-blocking flag, we Oops when dereferencing a NULL file pointer. Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/sctp/socket.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 1e788279bb2..b1917f68723 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -980,6 +980,7 @@ static int __sctp_connect(struct sock* sk,
union sctp_addr *sa_addr;
void *addr_buf;
unsigned short port;
+ unsigned int f_flags = 0;
sp = sctp_sk(sk);
ep = sp->ep;
@@ -1106,7 +1107,14 @@ static int __sctp_connect(struct sock* sk,
af->to_sk_daddr(&to, sk);
sk->sk_err = 0;
- timeo = sock_sndtimeo(sk, sk->sk_socket->file->f_flags & O_NONBLOCK);
+ /* in-kernel sockets don't generally have a file allocated to them
+ * if all they do is call sock_create_kern().
+ */
+ if (sk->sk_socket->file)
+ f_flags = sk->sk_socket->file->f_flags;
+
+ timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK);
+
err = sctp_wait_for_connect(asoc, &timeo);
/* Don't free association on exit. */