net/ipv4: Ensure that location of timestamp option is stored
This is needed in order to detect if the timestamp option appears more than once in a packet, to remove the option if the packet is fragmented, etc. My previous change neglected to store the option location when the router addresses were prespecified and Pointer > Length. But now the option location is also stored when Flag is an unrecognized value, to ensure these option handling behaviors are still performed. Signed-off-by: David Ward <david.ward@ll.mit.edu> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
47ce9c4821
commit
4660c7f498
|
@ -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);
|
||||
|
@ -429,12 +426,12 @@ int ip_options_compile(struct net *net,
|
|||
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) {
|
||||
|
|
Loading…
Reference in New Issue