1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
Index: print-bgp.c
===================================================================
RCS file: /home/ncvs/src/print-bgp.c,v
retrieving revision 1.1.1.5
diff -u -d -r1.1.1.5 print-bgp.c
--- print-bgp.c 31 Mar 2004 09:16:43 -0000 1.1.1.5
+++ print-bgp.c 30 May 2005 21:03:44 -0000
@@ -1216,6 +1216,8 @@
tptr = pptr + len;
break;
}
+ if (advance < 0) /* infinite loop protection */
+ break;
tptr += advance;
}
break;
@@ -1646,9 +1648,10 @@
while (dat + length > p) {
char buf[MAXHOSTNAMELEN + 100];
i = decode_prefix4(p, buf, sizeof(buf));
- if (i == -1)
+ if (i == -1) {
printf("\n\t (illegal prefix length)");
- else if (i == -2)
+ break;
+ } else if (i == -2)
goto trunc;
else {
printf("\n\t %s", buf);
Index: print-isoclns.c
===================================================================
RCS file: /home/ncvs/src/print-isoclns.c,v
retrieving revision 1.12
diff -u -d -r1.12 print-isoclns.c
--- print-isoclns.c 31 Mar 2004 14:57:24 -0000 1.12
+++ print-isoclns.c 22 May 2005 21:49:06 -0000
@@ -1508,6 +1508,9 @@
tlv_type,
tlv_len);
+ if (tlv_len == 0) /* something is malformed */
+ break;
+
/* now check if we have a decoder otherwise do a hexdump at the end*/
switch (tlv_type) {
case TLV_AREA_ADDR:
@@ -1538,7 +1541,7 @@
break;
case TLV_ISNEIGH_VARLEN:
- if (!TTEST2(*tptr, 1))
+ if (!TTEST2(*tptr, 1) || tmp < 3) /* min. TLV length */
goto trunctlv;
lan_alen = *tptr++; /* LAN adress length */
tmp --;
Index: print-ldp.c
===================================================================
RCS file: /home/ncvs/src/print-ldp.c,v
retrieving revision 1.1.1.1
diff -u -d -r1.1.1.1 print-ldp.c
--- print-ldp.c 31 Mar 2004 09:16:56 -0000 1.1.1.1
+++ print-ldp.c 30 May 2005 21:11:28 -0000
@@ -326,6 +326,9 @@
EXTRACT_32BITS(&ldp_msg_header->id),
LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore");
+ if (msg_len == 0) /* infinite loop protection */
+ break;
+
msg_tptr=tptr+sizeof(struct ldp_msg_header);
msg_tlen=msg_len-sizeof(struct ldp_msg_header)+4; /* Type & Length fields not included */
Index: print-rsvp.c
===================================================================
RCS file: /home/ncvs/src/print-rsvp.c,v
retrieving revision 1.1.1.1
diff -u -d -r1.1.1.1 print-rsvp.c
--- print-rsvp.c 31 Mar 2004 09:17:07 -0000 1.1.1.1
+++ print-rsvp.c 21 May 2005 20:13:29 -0000
@@ -875,10 +875,17 @@
switch(rsvp_obj_ctype) {
case RSVP_CTYPE_IPV4:
while(obj_tlen >= 4 ) {
- printf("\n\t Subobject Type: %s",
+ printf("\n\t Subobject Type: %s, length %u",
tok2str(rsvp_obj_xro_values,
"Unknown %u",
- RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)));
+ RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)),
+ *(obj_tptr+1));
+
+ if (*(obj_tptr+1) == 0) { /* prevent infinite loops */
+ printf("\n\t ERROR: zero length ERO subtype");
+ break;
+ }
+
switch(RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)) {
case RSVP_OBJ_XRO_IPV4:
printf(", %s, %s/%u, Flags: [%s]",
|