aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@nuts.davemloft.net>2004-07-22 00:01:38 -0700
committerDavid S. Miller <davem@nuts.davemloft.net>2004-07-22 00:01:38 -0700
commit02bc27cb2a867d11d8551389df0481d7d2ec83f7 (patch)
tree1e9d1beadbb302782da7e046e9b357496796a01f /net
parentc5de793d22c938557bcfe0d42e3c1ef568807e09 (diff)
downloadhistory-02bc27cb2a867d11d8551389df0481d7d2ec83f7.tar.gz
[TCP]: Do not overflow 16-bit window field in tcp_select_window().
Signed-off-by: David S. Miller <davem@redhat.com>
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/tcp_output.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 292dc9fc0b6d9b..68ab99fc037019 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -168,6 +168,14 @@ static __inline__ u16 tcp_select_window(struct sock *sk)
tp->rcv_wnd = new_win;
tp->rcv_wup = tp->rcv_nxt;
+ /* Make sure we do not exceed the maximum possible
+ * scaled window.
+ */
+ if (!tp->rcv_wscale)
+ new_win = min(new_win, MAX_TCP_WINDOW);
+ else
+ new_win = min(new_win, (65535U << tp->rcv_wscale));
+
/* RFC1323 scaling applied */
new_win >>= tp->rcv_wscale;