patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
89 lines
3.4 KiB
Diff
89 lines
3.4 KiB
Diff
Index: contrib/tcpdump/print-bgp.c
|
|
===================================================================
|
|
RCS file: /usr/ncvs/src/contrib/tcpdump/print-bgp.c,v
|
|
retrieving revision 1.1.1.5.2.1
|
|
diff -u -r1.1.1.5.2.1 print-bgp.c
|
|
--- contrib/tcpdump/print-bgp.c 8 Jun 2005 21:26:27 -0000 1.1.1.5.2.1
|
|
+++ contrib/tcpdump/print-bgp.c 22 Jul 2007 00:33:54 -0000
|
|
@@ -618,6 +618,26 @@
|
|
return -2;
|
|
}
|
|
|
|
+/*
|
|
+ * As I remember, some versions of systems have an snprintf() that
|
|
+ * returns -1 if the buffer would have overflowed. If the return
|
|
+ * value is negative, set buflen to 0, to indicate that we've filled
|
|
+ * the buffer up.
|
|
+ *
|
|
+ * If the return value is greater than buflen, that means that
|
|
+ * the buffer would have overflowed; again, set buflen to 0 in
|
|
+ * that case.
|
|
+ */
|
|
+#define UPDATE_BUF_BUFLEN(buf, buflen, strlen) \
|
|
+ if (strlen<0) \
|
|
+ buflen=0; \
|
|
+ else if ((u_int)strlen>buflen) \
|
|
+ buflen=0; \
|
|
+ else { \
|
|
+ buflen-=strlen; \
|
|
+ buf+=strlen; \
|
|
+ }
|
|
+
|
|
static int
|
|
decode_labeled_vpn_l2(const u_char *pptr, char *buf, u_int buflen)
|
|
{
|
|
@@ -628,11 +648,13 @@
|
|
tlen=plen;
|
|
pptr+=2;
|
|
TCHECK2(pptr[0],15);
|
|
+ buf[0]='\0';
|
|
strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u",
|
|
bgp_vpn_rd_print(pptr),
|
|
EXTRACT_16BITS(pptr+8),
|
|
EXTRACT_16BITS(pptr+10),
|
|
EXTRACT_24BITS(pptr+12)>>4); /* the label is offsetted by 4 bits so lets shift it right */
|
|
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
|
|
pptr+=15;
|
|
tlen-=15;
|
|
|
|
@@ -648,23 +670,32 @@
|
|
|
|
switch(tlv_type) {
|
|
case 1:
|
|
- strlen+=snprintf(buf+strlen,buflen-strlen, "\n\t\tcircuit status vector (%u) length: %u: 0x",
|
|
- tlv_type,
|
|
- tlv_len);
|
|
+ if (buflen!=0) {
|
|
+ strlen=snprintf(buf,buflen, "\n\t\tcircuit status vector (%u) length: %u: 0x",
|
|
+ tlv_type,
|
|
+ tlv_len);
|
|
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
|
|
+ }
|
|
ttlv_len=ttlv_len/8+1; /* how many bytes do we need to read ? */
|
|
while (ttlv_len>0) {
|
|
TCHECK(pptr[0]);
|
|
- strlen+=snprintf(buf+strlen,buflen-strlen, "%02x",*pptr++);
|
|
+ if (buflen!=0) {
|
|
+ strlen=snprintf(buf,buflen, "%02x",*pptr++);
|
|
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
|
|
+ }
|
|
ttlv_len--;
|
|
}
|
|
break;
|
|
default:
|
|
- snprintf(buf+strlen,buflen-strlen, "\n\t\tunknown TLV #%u, length: %u",
|
|
- tlv_type,
|
|
- tlv_len);
|
|
+ if (buflen!=0) {
|
|
+ strlen=snprintf(buf,buflen, "\n\t\tunknown TLV #%u, length: %u",
|
|
+ tlv_type,
|
|
+ tlv_len);
|
|
+ UPDATE_BUF_BUFLEN(buf, buflen, strlen);
|
|
+ }
|
|
break;
|
|
}
|
|
- tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it tright */
|
|
+ tlen-=(tlv_len<<3); /* the tlv-length is expressed in bits so lets shift it right */
|
|
}
|
|
return plen+2;
|
|
|