[comp.unix.wizards] BSD4.2 IP options bug

Hampton@DOCKMASTER.arpa (David R. Hampton) (11/23/87)

Subject:  Bug in BSD4.2 IP option fragmentation and reassembly

Index:    netinet/ip_input.c
          netinet/ip_output.c

Description:
        This problem occurs only on outgoing IP packets that must be
        fragmented, and incoming fragments that must be reassembled.
        The problem exists because the fragmentation and reassembly
        routines use the size of a standard IP header (20 bytes) in
        their calculations for determining where the IP data begins.
        Note that the routine that does the actual copying of options
        functions correctly.

Repeat-by:
        This is kind of hard to do if your system doesn't implement
        outgoing IP options. (Standard 4.2 doesn't.) If you can find
        a host that implements options, send fragmented packets
        containing a copy-on-fragmentation option to your 4.2 host.
        IP receives all of them, but it never passes them off to TCP.

Fix:
        *****  netinet/ip_output.c  *****

        140c140,141
        < m->m_len -= sizeof (struct ip);
        < m->m_off += sizeof (struct ip);
        ---
        > m->m_len -= hlen;
        > m->m_off += hlen;
        165c165
        < mhip->ip_len += sizeof (struct ip);
        ---
        > mhip->ip_len += mh->m_len;

        
        ***** netinet/ip_input.c  *****

        356c356,357        
        < m->m_len += sizeof (struct ipasfrag);
        < m->m_off -= sizeof (struct ipasfrag);
        ---
        > m->m_len += ((struct ip*) ip)->ip_hl << 2;
        > m->m_off -= ((struct ip*) ip)->ip_hl << 2;