Merge from vendor branch TCPDUMP:
[dragonfly.git] / usr.sbin / tcpdump / tcpdump / print-bgp.c.patch
1 $DragonFly: src/usr.sbin/tcpdump/tcpdump/Attic/print-bgp.c.patch,v 1.1 2007/08/01 22:24:34 pavalos Exp $
2
3 Index: print-bgp.c
4 ===================================================================
5 RCS file: /home/dcvs/src/contrib/tcpdump-3.9/print-bgp.c,v
6 retrieving revision 1.1.1.1
7 diff -u -r1.1.1.1 print-bgp.c
8 --- print-bgp.c 25 Dec 2006 00:17:39 -0000      1.1.1.1
9 +++ print-bgp.c 1 Aug 2007 21:57:48 -0000
10 @@ -650,6 +650,26 @@
11         return -2;
12  }
13  
14 +/*
15 + * As I remember, some versions of systems have an snprintf() that
16 + * returns -1 if the buffer would have overflowed.  If the return
17 + * value is negative, set buflen to 0, to indicate that we've filled
18 + * the buffer up.
19 + *
20 + * If the return value is greater than buflen, that means that
21 + * the buffer would have overflowed; again, set buflen to 0 in
22 + * that case.
23 + */
24 +#define UPDATE_BUF_BUFLEN(buf, buflen, strlen) \
25 +    if (strlen<0) \
26 +               buflen=0; \
27 +    else if ((u_int)strlen>buflen) \
28 +        buflen=0; \
29 +    else { \
30 +        buflen-=strlen; \
31 +       buf+=strlen; \
32 +    }
33 +
34  static int
35  decode_labeled_vpn_l2(const u_char *pptr, char *buf, u_int buflen)
36  {
37 @@ -660,11 +680,13 @@
38          tlen=plen;
39          pptr+=2;
40         TCHECK2(pptr[0],15);
41 +       buf[0]='\0';
42          strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u",
43                          bgp_vpn_rd_print(pptr),
44                          EXTRACT_16BITS(pptr+8),
45                          EXTRACT_16BITS(pptr+10),
46                          EXTRACT_24BITS(pptr+12)>>4); /* the label is offsetted by 4 bits so lets shift it right */
47 +        UPDATE_BUF_BUFLEN(buf, buflen, strlen);
48          pptr+=15;
49          tlen-=15;
50  
51 @@ -680,23 +702,32 @@
52  
53              switch(tlv_type) {
54              case 1:
55 -                strlen+=snprintf(buf+strlen,buflen-strlen, "\n\t\tcircuit status vector (%u) length: %u: 0x",
56 -                                 tlv_type,
57 -                                 tlv_len);
58 +                if (buflen!=0) {
59 +                    strlen=snprintf(buf,buflen, "\n\t\tcircuit status vector (%u) length: %u: 0x",
60 +                                    tlv_type,
61 +                                    tlv_len);
62 +                    UPDATE_BUF_BUFLEN(buf, buflen, strlen);
63 +                }
64                  ttlv_len=ttlv_len/8+1; /* how many bytes do we need to read ? */
65                  while (ttlv_len>0) {
66                      TCHECK(pptr[0]);
67 -                    strlen+=snprintf(buf+strlen,buflen-strlen, "%02x",*pptr++);
68 +                    if (buflen!=0) {
69 +                        strlen=snprintf(buf,buflen, "%02x",*pptr++);
70 +                        UPDATE_BUF_BUFLEN(buf, buflen, strlen);
71 +                    }
72                      ttlv_len--;
73                  }
74                  break;
75              default:
76 -                snprintf(buf+strlen,buflen-strlen, "\n\t\tunknown TLV #%u, length: %u",
77 -                         tlv_type,
78 -                         tlv_len);
79 +                if (buflen!=0) {
80 +                    strlen=snprintf(buf,buflen, "\n\t\tunknown TLV #%u, length: %u",
81 +                                    tlv_type,
82 +                                    tlv_len);
83 +                    UPDATE_BUF_BUFLEN(buf, buflen, strlen);
84 +                }
85                  break;
86              }
87 -            tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it tright */
88 +            tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it right */
89          }
90          return plen+2;
91