diff options
Diffstat (limited to 'net/ipv4/ip_options.c')
| -rw-r--r-- | net/ipv4/ip_options.c | 7 | 
1 files changed, 2 insertions, 5 deletions
| diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index f6289bf6f33..ec7264514a8 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c @@ -370,7 +370,6 @@ int ip_options_compile(struct net *net,  				}  				switch (optptr[3]&0xF) {  				      case IPOPT_TS_TSONLY: -					opt->ts = optptr - iph;  					if (skb)  						timeptr = &optptr[optptr[2]-1];  					opt->ts_needtime = 1; @@ -381,7 +380,6 @@ int ip_options_compile(struct net *net,  						pp_ptr = optptr + 2;  						goto error;  					} -					opt->ts = optptr - iph;  					if (rt)  {  						spec_dst_fill(&spec_dst, skb);  						memcpy(&optptr[optptr[2]-1], &spec_dst, 4); @@ -396,7 +394,6 @@ int ip_options_compile(struct net *net,  						pp_ptr = optptr + 2;  						goto error;  					} -					opt->ts = optptr - iph;  					{  						__be32 addr;  						memcpy(&addr, &optptr[optptr[2]-1], 4); @@ -423,18 +420,18 @@ int ip_options_compile(struct net *net,  					put_unaligned_be32(midtime, timeptr);  					opt->is_changed = 1;  				} -			} else { +			} else if ((optptr[3]&0xF) != IPOPT_TS_PRESPEC) {  				unsigned int overflow = optptr[3]>>4;  				if (overflow == 15) {  					pp_ptr = optptr + 3;  					goto error;  				} -				opt->ts = optptr - iph;  				if (skb) {  					optptr[3] = (optptr[3]&0xF)|((overflow+1)<<4);  					opt->is_changed = 1;  				}  			} +			opt->ts = optptr - iph;  			break;  		      case IPOPT_RA:  			if (optlen < 4) { |