tcp: Return error instead of partial read for saved syn headers
authorEric B Munson <emunson@akamai.com>
Mon, 18 May 2015 18:35:58 +0000 (14:35 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 May 2015 20:33:34 +0000 (16:33 -0400)
Currently the getsockopt() requesting the cached contents of the syn
packet headers will fail silently if the caller uses a buffer that is
too small to contain the requested data.  Rather than fail silently and
discard the headers, getsockopt() should return an error and report the
required size to hold the data.

Signed-off-by: Eric B Munson <emunson@akamai.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp.c

index c724195e586287760e9406c3bccde4b3d0c0c75e..bb9bb844204f9f0cf9197fe323f287dce5e5bbd9 100644 (file)
@@ -2845,7 +2845,15 @@ static int do_tcp_getsockopt(struct sock *sk, int level,
 
                lock_sock(sk);
                if (tp->saved_syn) {
-                       len = min_t(unsigned int, tp->saved_syn[0], len);
+                       if (len < tp->saved_syn[0]) {
+                               if (put_user(tp->saved_syn[0], optlen)) {
+                                       release_sock(sk);
+                                       return -EFAULT;
+                               }
+                               release_sock(sk);
+                               return -EINVAL;
+                       }
+                       len = tp->saved_syn[0];
                        if (put_user(len, optlen)) {
                                release_sock(sk);
                                return -EFAULT;