| version 1.113, 2000/05/10 01:19:44 |
version 1.114, 2000/05/10 03:31:30 |
|
|
| goto bad; |
goto bad; |
| } |
} |
| optlen = cp[IPOPT_OLEN]; |
optlen = cp[IPOPT_OLEN]; |
| if (optlen <= 0 || optlen > cnt) { |
if (optlen < IPOPT_OLEN + sizeof(*cp) || optlen > cnt) { |
| code = &cp[IPOPT_OLEN] - (u_char *)ip; |
code = &cp[IPOPT_OLEN] - (u_char *)ip; |
| goto bad; |
goto bad; |
| } |
} |
|
|
| code = ICMP_UNREACH_NET_PROHIB; |
code = ICMP_UNREACH_NET_PROHIB; |
| goto bad; |
goto bad; |
| } |
} |
| |
if (optlen < IPOPT_OFFSET + sizeof(*cp)) { |
| |
code = &cp[IPOPT_OLEN] - (u_char *)ip; |
| |
goto bad; |
| |
} |
| if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { |
if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { |
| code = &cp[IPOPT_OFFSET] - (u_char *)ip; |
code = &cp[IPOPT_OFFSET] - (u_char *)ip; |
| goto bad; |
goto bad; |
| Line 1049 ip_dooptions(m) |
|
| Line 1053 ip_dooptions(m) |
|
| break; |
break; |
| |
|
| case IPOPT_RR: |
case IPOPT_RR: |
| |
if (optlen < IPOPT_OFFSET + sizeof(*cp)) { |
| |
code = &cp[IPOPT_OLEN] - (u_char *)ip; |
| |
goto bad; |
| |
} |
| if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { |
if ((off = cp[IPOPT_OFFSET]) < IPOPT_MINOFF) { |
| code = &cp[IPOPT_OFFSET] - (u_char *)ip; |
code = &cp[IPOPT_OFFSET] - (u_char *)ip; |
| goto bad; |
goto bad; |
| Line 1080 ip_dooptions(m) |
|
| Line 1088 ip_dooptions(m) |
|
| case IPOPT_TS: |
case IPOPT_TS: |
| code = cp - (u_char *)ip; |
code = cp - (u_char *)ip; |
| ipt = (struct ip_timestamp *)cp; |
ipt = (struct ip_timestamp *)cp; |
| if (ipt->ipt_len < 5) |
if (ipt->ipt_len < 4 || ipt->ipt_len > 40) { |
| |
code = (u_char *)&ipt->ipt_len - (u_char *)ip; |
| goto bad; |
goto bad; |
| |
} |
| |
if (ipt->ipt_ptr < 5) { |
| |
code = (u_char *)&ipt->ipt_ptr - (u_char *)ip; |
| |
goto bad; |
| |
} |
| if (ipt->ipt_ptr > ipt->ipt_len - sizeof (int32_t)) { |
if (ipt->ipt_ptr > ipt->ipt_len - sizeof (int32_t)) { |
| if (++ipt->ipt_oflw == 0) |
if (++ipt->ipt_oflw == 0) { |
| |
code = (u_char *)&ipt->ipt_ptr - |
| |
(u_char *)ip; |
| goto bad; |
goto bad; |
| |
} |
| break; |
break; |
| } |
} |
| cp0 = (cp + ipt->ipt_ptr - 1); |
cp0 = (cp + ipt->ipt_ptr - 1); |
| Line 1095 ip_dooptions(m) |
|
| Line 1112 ip_dooptions(m) |
|
| |
|
| case IPOPT_TS_TSANDADDR: |
case IPOPT_TS_TSANDADDR: |
| if (ipt->ipt_ptr - 1 + sizeof(n_time) + |
if (ipt->ipt_ptr - 1 + sizeof(n_time) + |
| sizeof(struct in_addr) > ipt->ipt_len) |
sizeof(struct in_addr) > ipt->ipt_len) { |
| |
code = (u_char *)&ipt->ipt_ptr - |
| |
(u_char *)ip; |
| goto bad; |
goto bad; |
| |
} |
| ipaddr.sin_addr = dst; |
ipaddr.sin_addr = dst; |
| ia = ifatoia(ifaof_ifpforaddr(sintosa(&ipaddr), |
ia = ifatoia(ifaof_ifpforaddr(sintosa(&ipaddr), |
| m->m_pkthdr.rcvif)); |
m->m_pkthdr.rcvif)); |
| Line 1109 ip_dooptions(m) |
|
| Line 1129 ip_dooptions(m) |
|
| |
|
| case IPOPT_TS_PRESPEC: |
case IPOPT_TS_PRESPEC: |
| if (ipt->ipt_ptr - 1 + sizeof(n_time) + |
if (ipt->ipt_ptr - 1 + sizeof(n_time) + |
| sizeof(struct in_addr) > ipt->ipt_len) |
sizeof(struct in_addr) > ipt->ipt_len) { |
| |
code = (u_char *)&ipt->ipt_ptr - |
| |
(u_char *)ip; |
| goto bad; |
goto bad; |
| |
} |
| bcopy(cp0, &ipaddr.sin_addr, |
bcopy(cp0, &ipaddr.sin_addr, |
| sizeof(struct in_addr)); |
sizeof(struct in_addr)); |
| if (ifatoia(ifa_ifwithaddr(sintosa(&ipaddr))) |
if (ifatoia(ifa_ifwithaddr(sintosa(&ipaddr))) |
| Line 1120 ip_dooptions(m) |
|
| Line 1143 ip_dooptions(m) |
|
| break; |
break; |
| |
|
| default: |
default: |
| |
/* XXX can't take &ipt->ipt_flg */ |
| |
code = (u_char *)&ipt->ipt_ptr - |
| |
(u_char *)ip + 1; |
| goto bad; |
goto bad; |
| } |
} |
| ntime = iptime(); |
ntime = iptime(); |