Date: Fri, 2 Jul 1999 10:42:05 +0800 From: "Witman Peng" <witman@iname.com> To: "venkat venkatsubra" <venkats@austin.ibm.com> Cc: <freebsd-net@FreeBSD.ORG>, <freebsd-bugs@FreeBSD.ORG> Subject: Re: IP reassemble fails if it contains more that 20 bytes options? Message-ID: <008f01bec434$82154c90$010000c8@heart.witman.com>
next in thread | raw e-mail | index | archive | help
But if this packet is stored in a cluster, hlen is always less than m->len
(which is greater that 207). So the following code will never be run.
BR
Witman Peng
-----Original Message-----
From: venkat venkatsubra <venkats@austin.ibm.com>
To: Witman Peng <witman@iname.com>
Cc: freebsd-net@FreeBSD.ORG <freebsd-net@FreeBSD.ORG>;
freebsd-bugs@FreeBSD.ORG <freebsd-bugs@FreeBSD.ORG>
Date: 1999?7?1? 22:00
Subject: Re: IP reassemble fails if it contains more that 20 bytes options?
>Witman,
> Isn't this taken care of early in ipintr ?
>--------------------------
>if (hlen > m->m_len) {
> if ((m = m_pullup(m, hlen)) == 0) {
> ipstat.ips_badhlen++;
> goto next;
> }
> ip = mtod(m, struct ip *);
> }
>---------------------------
>
>Venkat
>
>Witman Peng wrote:
>
>> Hi, All
>>
>> I am developing an application based on 4.4BSD-Lite source code. When I
port
>> the code in file netinet/ip_input.c, I found a problem. But I have no
chance
>> to install FreeBSD and test it, so I am not sure whether it'a bug or not.
>> The following are the code to reassemble the IP fragments from
ip_input.c:
>>
>> >From routine ipintr:
>> if (ip->ip_off &~ IP_DF) {
>> if (m->m_flags & M_EXT) { /* XXX */
>> if ((m = m_pullup(m, sizeof (struct ip))) == 0) {
>> ipstat.ips_toosmall++;
>> goto next;
>> }
>> ip = mtod(m, struct ip *);
>> }
>>
>> >From routine ip_reass:
>> int hlen = ip->ip_hl << 2;
>> int i, next;
>>
>> m->m_data += hlen;
>> m->m_len -= hlen;
>>
>> Suppose a fragment with more that 208 bytes and 40 bytes IP option, it
will
>> be stored in the cluster but not mbuf. In routine ipintr, function pullup
>> just pullup sizeof(struct ip) (maybe 40 bytes for tcp header) bytes into
a
>> new mbuf. However, the IP header is 60 (20 + 40) bytes, so the complete
IP
>> header cannot be stored in this mbuf. Then in routine ip_reass, after run
>> the above code, m->m_data will pointer to an incorrect address.
>>
>> Dose it seems right? Any inputs would be apprecaited.
>>
>> BR,
>> Witman Peng
>>
>> To Unsubscribe: send mail to majordomo@FreeBSD.org
>> with "unsubscribe freebsd-net" in the body of the message
>
>
>
>To Unsubscribe: send mail to majordomo@FreeBSD.org
>with "unsubscribe freebsd-net" in the body of the message
>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?008f01bec434$82154c90$010000c8>
