[PATCH] ICMP extensions for MPLS support for traceroute(8)

Matthew Dillon dillon at apollo.backplane.com
Mon May 21 17:39:40 PDT 2007


:+	 data_len = ip_len - ((u_char *)cmn_hdr - (u_char *)ip);
:+
:...
:+	 buf += sizeof(*cmn_hdr);
:+	 data_len -= sizeof(*cmn_hdr);
:+
:+	 while (data_len > 0) {
:+		obj_hdr = (struct icmp_ext_obj_hdr *)buf;
:+		obj_len = ntohs(obj_hdr->length);

    This should be data_len >= sizeof(struct icmp_ext_obj_hdr), 
    not >= 0.
	
	 while (data_len >= sizeof(struct icmp_ext_obj_hdr)) {
		...

:+
:+		/*
:+		 * Sanity check the length field
:+		 */
:+		if (obj_len > data_len) {
:+			return;
:+		}

    obj_len can be 0.  Check that obj_len < sizeof(*obj_hdr)
    and return if it isn't.  obj_len can be an odd number, which
    is also not a good idea.  Note sure about alignment requirements,
    it might even have to be 4-byte aligned.  But 2-byte for sure.

		if (obj_len < sizeof(*obj_hdr) || obj_len > data_len)
			return;
		if (obj_len & 3)	/* either & 1 or & 3, depending */
			return;

:+
:+		data_len -= obj_len;
:+
:+		/*
:+		 * Move past the object header
:+		 */
:+		buf += sizeof(struct icmp_ext_obj_hdr);
:+		obj_len -= sizeof(struct icmp_ext_obj_hdr);
:+
:+		switch (obj_hdr->class_num) {
:+		case MPLS_STACK_ENTRY_CLASS:
:+			switch (obj_hdr->c_type) {
:+			case MPLS_STACK_ENTRY_C_TYPE:
:+				while (obj_len >= (int)sizeof(uint32_t)) {
:+					mpls_hdr = ntohl(*(uint32_t *)buf);
:+
:+					buf += sizeof(uint32_t);
:+					obj_len -= sizeof(uint32_t);
:+					printf(" [MPLS: Label %d Exp %d]",
:+					    MPLS_LABEL(mpls_hdr), MPLS_EXP(mpls_hdr));
:+				}
:+				if (obj_len > 0) {
:+					/*
:+					 * Something went wrong, and we're at
:+					 * a unknown offset into the packet,
:+					 * ditch the rest of it.
:+					 */
:+					return;
:+				}
:+				break;
:+			default:
:+				/*
:+				 * Unknown object, skip past it
:+				 */
:+				buf += ntohs(obj_hdr->length) -
:+				    sizeof(struct icmp_ext_obj_hdr);

    Hmm.  This is a bit messy

:...
:+			/*
:+			 * Unknown object, skip past it
:+			 */
:+			buf += ntohs(obj_hdr->length) -
:+			    sizeof(struct icmp_ext_obj_hdr);

    Same... a bit messy.

    I suggest declaring a 'nextbuf' which you calculate up at the
    'Move past the object header' code and just assign buf = nextbuf
    in these two places.

:+			break;
:+		}
:+	}
: }

					-Matt
					Matthew Dillon 
					<dillon at backplane.com>





More information about the Submit mailing list