diff options
-rw-r--r-- | net/ipv4/tcp.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index bf9a8ab29459..5f6419341821 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2331,10 +2331,17 @@ static int tcp_repair_options_est(struct tcp_sock *tp, | |||
2331 | tp->rx_opt.mss_clamp = opt.opt_val; | 2331 | tp->rx_opt.mss_clamp = opt.opt_val; |
2332 | break; | 2332 | break; |
2333 | case TCPOPT_WINDOW: | 2333 | case TCPOPT_WINDOW: |
2334 | if (opt.opt_val > 14) | 2334 | { |
2335 | return -EFBIG; | 2335 | u16 snd_wscale = opt.opt_val & 0xFFFF; |
2336 | u16 rcv_wscale = opt.opt_val >> 16; | ||
2337 | |||
2338 | if (snd_wscale > 14 || rcv_wscale > 14) | ||
2339 | return -EFBIG; | ||
2336 | 2340 | ||
2337 | tp->rx_opt.snd_wscale = opt.opt_val; | 2341 | tp->rx_opt.snd_wscale = snd_wscale; |
2342 | tp->rx_opt.rcv_wscale = rcv_wscale; | ||
2343 | tp->rx_opt.wscale_ok = 1; | ||
2344 | } | ||
2338 | break; | 2345 | break; |
2339 | case TCPOPT_SACK_PERM: | 2346 | case TCPOPT_SACK_PERM: |
2340 | if (opt.opt_val != 0) | 2347 | if (opt.opt_val != 0) |