diff --git a/extra/quagga/APKBUILD b/extra/quagga/APKBUILD index 05d2ac8726c3bbc5c85ecfdd95bb8f0a8b0ab6b5..d69803cb4232338eed0c5864f998e5052fb76a03 100644 --- a/extra/quagga/APKBUILD +++ b/extra/quagga/APKBUILD @@ -1,11 +1,11 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=quagga -pkgver=0.99.11 -pkgrel=10 +pkgver=0.99.12 +pkgrel=0 pkgdesc="A free routing daemon replacing Zebra supporting RIP, OSPF and BGP." url="http://quagga.net/" license="GPL-2" -depends="uclibc readline ncurses iproute2" +depends="iproute2" makedepends="readline-dev ncurses-dev autoconf automake libtool" install="$pkgname.pre-install $pkgname.post-install" @@ -13,12 +13,10 @@ subpackages="$pkgname-dev $pkgname-doc" source="http://www.quagga.net/download/$pkgname-$pkgver.tar.gz $pkgname-0.99.11-link-libcap.patch $pkgname-0.99.11-ipv6.patch - $pkgname-0.99.11-checksum.patch $pkgname-0.99.11-ipv6-only.patch $pkgname-0.99.11-del-routes.patch $pkgname-0.99.11-zombie.patch $pkgname-0.99.11-fd-leak.patch - $pkgname-CVE-2009-1572.patch bgpd.initd ospf6d.initd ospfd.initd @@ -65,15 +63,13 @@ build() { done install -Dm644 "$srcdir/zebra.confd" "$pkgdir"/etc/conf.d/zebra } -md5sums="903e40c744730ad4d62bee872eeb813b quagga-0.99.11.tar.gz +md5sums="d2bb513f4ac113dbb300c15a0bd0a241 quagga-0.99.12.tar.gz 8f99d41a8ed79e51704e8f655d255f29 quagga-0.99.11-link-libcap.patch d73000d128eaf20a17ffb15b5ca1805a quagga-0.99.11-ipv6.patch -7e1c0152d4733b713613e10df207e3a9 quagga-0.99.11-checksum.patch 44c517e988273e0e5076d24f3959a125 quagga-0.99.11-ipv6-only.patch 1cbcf60a637b2577dee4d6df711e1247 quagga-0.99.11-del-routes.patch ce345725f2e7240cebe0fd5ac2b2fc48 quagga-0.99.11-zombie.patch e2391e19b542ec1743776ca9e36ac11a quagga-0.99.11-fd-leak.patch -ab0119615ef8379b523fce30e774f93e quagga-CVE-2009-1572.patch cc109a746273bc0d6aee9d758e7524ab bgpd.initd 44547b687343ebfed7524cebc5626067 ospf6d.initd 89b0cf4e70172bfcd195b2869cae28da ospfd.initd diff --git a/extra/quagga/quagga-0.99.11-checksum.patch b/extra/quagga/quagga-0.99.11-checksum.patch deleted file mode 100644 index c8480ac5c65f8aaad39b7c0d6d9d0c73968d449d..0000000000000000000000000000000000000000 --- a/extra/quagga/quagga-0.99.11-checksum.patch +++ /dev/null @@ -1,654 +0,0 @@ -From: Paul Jakma <paul.jakma@sun.com> -Date: Sun, 16 Nov 2008 18:34:19 +0000 (+0000) -Subject: [lib] Switch Fletcher checksum back to old ospfd version -X-Git-Url: http://code.quagga.net/cgi-bin/gitweb.cgi?p=quagga.git;a=commitdiff_plain;h=5d4b8cf2faba9f5386810a7c70837e5b7fae3572 - -[lib] Switch Fletcher checksum back to old ospfd version - -* lib/checksum.c: (fletcher_checksum) Switch the second phase of the checksum - back to the old ospfd logic. - - The isisd-derived version: - - a) is very hard to follow - b) had some kind of subtle bug that caused it be wrong when c0=0 and c1=254 - (potentially fixable by doing the mods before adjusting x and y) - - Additionally: - - - explicitely cast expressions using non-internal variables to int, to ensure - the result is signed. - - defensively change the length argument to 'size_t', to ensure the code - works with that argument being unsigned.. - - Thanks to Joakim Tjernlund for the investigative work into this bug. - -* tests/test-checksum.c: new file to exercise the checksum code. ---- - -diff --git a/lib/checksum.c b/lib/checksum.c -index 88ec72a..f6d74d3 100644 ---- a/lib/checksum.c -+++ b/lib/checksum.c -@@ -52,34 +52,31 @@ in_cksum(void *parg, int nbytes) - /* To be consistent, offset is 0-based index, rather than the 1-based - index required in the specification ISO 8473, Annex C.1 */ - u_int16_t --fletcher_checksum(u_char * buffer, int len, u_int16_t offset) -+fletcher_checksum(u_char * buffer, const size_t len, const uint16_t offset) - { - u_int8_t *p; -- int x; -- int y; -- u_int32_t mul; -- u_int32_t c0; -- u_int32_t c1; -+ int x, y, c0, c1; - u_int16_t checksum; - u_int16_t *csum; -- int i, init_len, partial_len; -- -+ size_t partial_len, i, left = len; -+ - checksum = 0; - -+ assert (offset < len); -+ - /* - * Zero the csum in the packet. - */ - csum = (u_int16_t *) (buffer + offset); -- *(csum) = checksum; -+ *(csum) = 0; - - p = buffer; - c0 = 0; - c1 = 0; -- init_len = len; - -- while (len != 0) -+ while (left != 0) - { -- partial_len = MIN(len, MODX); -+ partial_len = MIN(left, MODX); - - for (i = 0; i < partial_len; i++) - { -@@ -90,27 +87,18 @@ fletcher_checksum(u_char * buffer, int len, u_int16_t offset) - c0 = c0 % 255; - c1 = c1 % 255; - -- len -= partial_len; -+ left -= partial_len; - } -- -- mul = (init_len - offset)*(c0); -- -- x = mul - c0 - c1; -- y = c1 - mul - 1; -- -- if (y > 0) -- y++; -- if (x < 0) -- x--; -- -- x %= 255; -- y %= 255; -- -- if (x == 0) -- x = 255; -- if (y == 0) -- y = 1; -- -+ -+ /* The cast is important, to ensure the mod is taken as a signed value. */ -+ x = ((int)(len - offset - 1) * c0 - c1) % 255; -+ -+ if (x <= 0) -+ x += 255; -+ y = 510 - c0 - x; -+ if (y > 255) -+ y -= 255; -+ - /* - * Now we write this to the packet. - * We could skip this step too, since the checksum returned would -diff --git a/lib/checksum.h b/lib/checksum.h -index d3ce930..da1d3cb 100644 ---- a/lib/checksum.h -+++ b/lib/checksum.h -@@ -1,2 +1,2 @@ - extern int in_cksum(void *, int); --extern u_int16_t fletcher_checksum(u_char * buffer, int len, u_int16_t offset); -+extern u_int16_t fletcher_checksum(u_char *, const size_t len, const uint16_t offset); -diff --git a/tests/Makefile.am b/tests/Makefile.am -index c93fa08..4ab507b 100644 ---- a/tests/Makefile.am -+++ b/tests/Makefile.am -@@ -6,7 +6,7 @@ AM_LDFLAGS = $(PILDFLAGS) - - noinst_PROGRAMS = testsig testbuffer testmemory heavy heavywq heavythread \ - aspathtest testprivs teststream testbgpcap ecommtest \ -- testbgpmpattr -+ testbgpmpattr testchecksum - - testsig_SOURCES = test-sig.c - testbuffer_SOURCES = test-buffer.c -@@ -20,6 +20,7 @@ aspathtest_SOURCES = aspath_test.c - testbgpcap_SOURCES = bgp_capability_test.c - ecommtest_SOURCES = ecommunity_test.c - testbgpmpattr_SOURCES = bgp_mp_attr_test.c -+testchecksum_SOURCES = test-checksum.c - - testsig_LDADD = ../lib/libzebra.la @LIBCAP@ - testbuffer_LDADD = ../lib/libzebra.la @LIBCAP@ -@@ -33,3 +34,4 @@ aspathtest_LDADD = ../lib/libzebra.la @LIBCAP@ -lm ../bgpd/libbgp.a - testbgpcap_LDADD = ../lib/libzebra.la @LIBCAP@ -lm ../bgpd/libbgp.a - ecommtest_LDADD = ../lib/libzebra.la @LIBCAP@ -lm ../bgpd/libbgp.a - testbgpmpattr_LDADD = ../lib/libzebra.la @LIBCAP@ -lm ../bgpd/libbgp.a -+testchecksum_LDADD = ../lib/libzebra.la @LIBCAP@ -diff --git a/tests/test-checksum.c b/tests/test-checksum.c -new file mode 100644 -index 0000000..d218840 ---- /dev/null -+++ b/tests/test-checksum.c -@@ -0,0 +1,499 @@ -+#include <zebra.h> -+#include <stdlib.h> -+#include <time.h> -+ -+#include "checksum.h" -+ -+struct thread_master *master; -+ -+struct acc_vals { -+ int c0; -+ int c1; -+}; -+ -+struct csum_vals { -+ struct acc_vals a; -+ int x; -+ int y; -+}; -+ -+static struct csum_vals ospfd_vals, isisd_vals; -+ -+typedef size_t testsz_t; -+typedef uint16_t testoff_t; -+ -+/* Fletcher Checksum -- Refer to RFC1008. */ -+#define MODX 4102 -+ -+/* Accumulator phase of checksum */ -+static -+struct acc_vals -+accumulate (u_char *buffer, testsz_t len, testoff_t off) -+{ -+ u_int8_t *p; -+ u_int16_t *csum; -+ int i, init_len, partial_len; -+ struct acc_vals ret; -+ -+ csum = (u_int16_t *) (buffer + off); -+ *(csum) = 0; -+ -+ p = buffer; -+ ret.c0 = 0; -+ ret.c1 = 0; -+ init_len = len; -+ -+ while (len != 0) -+ { -+ partial_len = MIN(len, MODX); -+ -+ for (i = 0; i < partial_len; i++) -+ { -+ ret.c0 = ret.c0 + *(p++); -+ ret.c1 += ret.c0; -+ } -+ -+ ret.c0 = ret.c0 % 255; -+ ret.c1 = ret.c1 % 255; -+ -+ len -= partial_len; -+ } -+ return ret; -+} -+ -+/* The final reduction phase. -+ * This one should be the original ospfd version -+ */ -+static u_int16_t -+reduce_ospfd (struct csum_vals *vals, testsz_t len, testoff_t off) -+{ -+#define x vals->x -+#define y vals->y -+#define c0 vals->a.c0 -+#define c1 vals->a.c1 -+ -+ x = ((len - off - 1) * c0 - c1) % 255; -+ -+ if (x <= 0) -+ x += 255; -+ y = 510 - c0 - x; -+ if (y > 255) -+ y -= 255; -+ -+ /* take care endian issue. */ -+ return htons ((x << 8) + y); -+#undef x -+#undef y -+#undef c0 -+#undef c1 -+} -+ -+/* slightly different concatenation */ -+static u_int16_t -+reduce_ospfd1 (struct csum_vals *vals, testsz_t len, testoff_t off) -+{ -+#define x vals->x -+#define y vals->y -+#define c0 vals->a.c0 -+#define c1 vals->a.c1 -+ -+ x = ((len - off - 1) * c0 - c1) % 255; -+ if (x <= 0) -+ x += 255; -+ y = 510 - c0 - x; -+ if (y > 255) -+ y -= 255; -+ -+ /* take care endian issue. */ -+ return htons ((x << 8) | (y & 0xff)); -+#undef x -+#undef y -+#undef c0 -+#undef c1 -+} -+ -+/* original isisd version */ -+static u_int16_t -+reduce_isisd (struct csum_vals *vals, testsz_t len, testoff_t off) -+{ -+#define x vals->x -+#define y vals->y -+#define c0 vals->a.c0 -+#define c1 vals->a.c1 -+ u_int32_t mul; -+ -+ mul = (len - off)*(c0); -+ x = mul - c0 - c1; -+ y = c1 - mul - 1; -+ -+ if (y > 0) -+ y++; -+ if (x < 0) -+ x--; -+ -+ x %= 255; -+ y %= 255; -+ -+ if (x == 0) -+ x = 255; -+ if (y == 0) -+ y = 1; -+ -+ return htons ((x << 8) | (y & 0xff)); -+ -+#undef x -+#undef y -+#undef c0 -+#undef c1 -+} -+ -+/* Is the -1 in y wrong perhaps? */ -+static u_int16_t -+reduce_isisd_yfix (struct csum_vals *vals, testsz_t len, testoff_t off) -+{ -+#define x vals->x -+#define y vals->y -+#define c0 vals->a.c0 -+#define c1 vals->a.c1 -+ u_int32_t mul; -+ -+ mul = (len - off)*(c0); -+ x = mul - c0 - c1; -+ y = c1 - mul; -+ -+ if (y > 0) -+ y++; -+ if (x < 0) -+ x--; -+ -+ x %= 255; -+ y %= 255; -+ -+ if (x == 0) -+ x = 255; -+ if (y == 0) -+ y = 1; -+ -+ return htons ((x << 8) | (y & 0xff)); -+ -+#undef x -+#undef y -+#undef c0 -+#undef c1 -+} -+ -+/* Move the mods yp */ -+static u_int16_t -+reduce_isisd_mod (struct csum_vals *vals, testsz_t len, testoff_t off) -+{ -+#define x vals->x -+#define y vals->y -+#define c0 vals->a.c0 -+#define c1 vals->a.c1 -+ u_int32_t mul; -+ -+ mul = (len - off)*(c0); -+ x = mul - c1 - c0; -+ y = c1 - mul - 1; -+ -+ x %= 255; -+ y %= 255; -+ -+ if (y > 0) -+ y++; -+ if (x < 0) -+ x--; -+ -+ if (x == 0) -+ x = 255; -+ if (y == 0) -+ y = 1; -+ -+ return htons ((x << 8) | (y & 0xff)); -+ -+#undef x -+#undef y -+#undef c0 -+#undef c1 -+} -+ -+/* Move the mods up + fix y */ -+static u_int16_t -+reduce_isisd_mody (struct csum_vals *vals, testsz_t len, testoff_t off) -+{ -+#define x vals->x -+#define y vals->y -+#define c0 vals->a.c0 -+#define c1 vals->a.c1 -+ u_int32_t mul; -+ -+ mul = (len - off)*(c0); -+ x = mul - c0 - c1; -+ y = c1 - mul; -+ -+ x %= 255; -+ y %= 255; -+ -+ if (y > 0) -+ y++; -+ if (x < 0) -+ x--; -+ -+ if (x == 0) -+ x = 255; -+ if (y == 0) -+ y = 1; -+ -+ return htons ((x << 8) | (y & 0xff)); -+ -+#undef x -+#undef y -+#undef c0 -+#undef c1 -+} -+ -+struct reductions_t { -+ const char *name; -+ u_int16_t (*f) (struct csum_vals *, testsz_t, testoff_t); -+} reducts[] = { -+ { .name = "ospfd", .f = reduce_ospfd }, -+ { .name = "ospfd-1", .f = reduce_ospfd1 }, -+ { .name = "isisd", .f = reduce_isisd }, -+ { .name = "isisd-yfix", .f = reduce_isisd_yfix }, -+ { .name = "isisd-mod", .f = reduce_isisd_mod }, -+ { .name = "isisd-mody", .f = reduce_isisd_mody }, -+ { NULL, NULL }, -+}; -+ -+/* The original ospfd checksum */ -+static u_int16_t -+ospfd_checksum (u_char *buffer, testsz_t len, testoff_t off) -+{ -+ u_char *sp, *ep, *p, *q; -+ int c0 = 0, c1 = 0; -+ int x, y; -+ u_int16_t checksum, *csum; -+ -+ csum = (u_int16_t *) (buffer + off); -+ *(csum) = 0; -+ -+ sp = buffer; -+ -+ for (ep = sp + len; sp < ep; sp = q) -+ { -+ q = sp + MODX; -+ if (q > ep) -+ q = ep; -+ for (p = sp; p < q; p++) -+ { -+ c0 += *p; -+ c1 += c0; -+ } -+ c0 %= 255; -+ c1 %= 255; -+ } -+ -+ ospfd_vals.a.c0 = c0; -+ ospfd_vals.a.c1 = c1; -+ -+ //printf ("%s: len %u, off %u, c0 %d, c1 %d\n", -+ // __func__, len, off, c0, c1); -+ -+ x = ((int)(len - off - 1) * (int)c0 - (int)c1) % 255; -+ -+ if (x <= 0) -+ x += 255; -+ y = 510 - c0 - x; -+ if (y > 255) -+ y -= 255; -+ -+ ospfd_vals.x = x; -+ ospfd_vals.y = y; -+ -+ buffer[off] = x; -+ buffer[off + 1] = y; -+ -+ /* take care endian issue. */ -+ checksum = htons ((x << 8) | (y & 0xff)); -+ -+ return (checksum); -+} -+ -+/* the original, broken isisd checksum */ -+static u_int16_t -+iso_csum_create (u_char * buffer, testsz_t len, testoff_t off) -+{ -+ -+ u_int8_t *p; -+ int x; -+ int y; -+ u_int32_t mul; -+ u_int32_t c0; -+ u_int32_t c1; -+ u_int16_t checksum, *csum; -+ int i, init_len, partial_len; -+ -+ checksum = 0; -+ -+ csum = (u_int16_t *) (buffer + off); -+ *(csum) = checksum; -+ -+ p = buffer; -+ c0 = 0; -+ c1 = 0; -+ init_len = len; -+ -+ while (len != 0) -+ { -+ partial_len = MIN(len, MODX); -+ -+ for (i = 0; i < partial_len; i++) -+ { -+ c0 = c0 + *(p++); -+ c1 += c0; -+ } -+ -+ c0 = c0 % 255; -+ c1 = c1 % 255; -+ -+ len -= partial_len; -+ } -+ -+ isisd_vals.a.c0 = c0; -+ isisd_vals.a.c1 = c1; -+ -+ mul = (init_len - off) * c0; -+ -+ x = mul - c1 - c0; -+ y = c1 - mul - 1; -+ -+ if (y > 0) -+ y++; -+ if (x < 0) -+ x--; -+ -+ x %= 255; -+ y %= 255; -+ -+ if (x == 0) -+ x = 255; -+ if (y == 0) -+ y = 1; -+ -+ isisd_vals.x = x; -+ isisd_vals.y = y; -+ -+ checksum = htons((x << 8) | (y & 0xFF)); -+ -+ *(csum) = checksum; -+ -+ /* return the checksum for user usage */ -+ return checksum; -+} -+ -+static int -+verify (u_char * buffer, testsz_t len) -+{ -+ u_int8_t *p; -+ u_int32_t c0; -+ u_int32_t c1; -+ u_int16_t checksum; -+ int i, partial_len; -+ -+ p = buffer; -+ checksum = 0; -+ -+ c0 = 0; -+ c1 = 0; -+ -+ while (len) -+ { -+ partial_len = MIN(len, 5803); -+ -+ for (i = 0; i < partial_len; i++) -+ { -+ c0 = c0 + *(p++); -+ c1 += c0; -+ } -+ c0 = c0 % 255; -+ c1 = c1 % 255; -+ -+ len -= partial_len; -+ } -+ -+ if (c0 == 0 && c1 == 0) -+ return 0; -+ -+ return 1; -+} -+ -+int -+main(int argc, char **argv) -+{ -+/* 60017 65629 702179 */ -+#define MAXDATALEN 60017 -+#define BUFSIZE MAXDATALEN + sizeof(u_int16_t) -+ u_char buffer[BUFSIZE]; -+ int exercise = 0; -+#define EXERCISESTEP 257 -+ -+ srandom (time (NULL)); -+ -+ while (1) { -+ u_int16_t ospfd, isisd, lib; -+ -+ exercise += EXERCISESTEP; -+ exercise %= MAXDATALEN; -+ -+ for (int i = 0; i < exercise; i += sizeof (long int)) { -+ long int rand = random (); -+ -+ for (int j = sizeof (long int); j > 0; j--) -+ buffer[i + (sizeof (long int) - j)] = (rand >> (j * 8)) & 0xff; -+ } -+ -+ ospfd = ospfd_checksum (buffer, exercise + sizeof(u_int16_t), exercise); -+ if (verify (buffer, exercise + sizeof(u_int16_t))) -+ printf ("verify: ospfd failed\n"); -+ isisd = iso_csum_create (buffer, exercise + sizeof(u_int16_t), exercise); -+ if (verify (buffer, exercise + sizeof(u_int16_t))) -+ printf ("verify: isisd failed\n"); -+ lib = fletcher_checksum (buffer, exercise + sizeof(u_int16_t), exercise); -+ if (verify (buffer, exercise + sizeof(u_int16_t))) -+ printf ("verify: lib failed\n"); -+ -+ if (ospfd != lib) { -+ printf ("Mismatch in values at size %u\n" -+ "ospfd: 0x%04x\tc0: %d\tc1: %d\tx: %d\ty: %d\n" -+ "isisd: 0x%04x\tc0: %d\tc1: %d\tx: %d\ty: %d\n" -+ "lib: 0x%04x\n", -+ exercise, -+ ospfd, ospfd_vals.a.c0, ospfd_vals.a.c1, ospfd_vals.x, ospfd_vals.y, -+ isisd, isisd_vals.a.c0, isisd_vals.a.c1, isisd_vals.x, isisd_vals.y, -+ lib -+ ); -+ -+ /* Investigate reduction phase discrepencies */ -+ if (ospfd_vals.a.c0 == isisd_vals.a.c0 -+ && ospfd_vals.a.c1 == isisd_vals.a.c1) { -+ printf ("\n"); -+ for (int i = 0; reducts[i].name != NULL; i++) { -+ ospfd = reducts[i].f (&ospfd_vals, -+ exercise + sizeof (u_int16_t), -+ exercise); -+ printf ("%20s: x: %02x, y %02x, checksum 0x%04x\n", -+ reducts[i].name, ospfd_vals.x & 0xff, ospfd_vals.y & 0xff, ospfd); -+ } -+ } -+ -+ printf ("\n u_char testdata [] = {\n "); -+ for (int i = 0; i < exercise; i++) { -+ printf ("0x%02x,%s", -+ buffer[i], -+ (i + 1) % 8 ? " " : "\n "); -+ } -+ printf ("\n}\n"); -+ exit (1); -+ } -+ } -+} diff --git a/extra/quagga/quagga-CVE-2009-1572.patch b/extra/quagga/quagga-CVE-2009-1572.patch deleted file mode 100644 index 70d33d94d3d1771912c68649abe7098a7b64f8ee..0000000000000000000000000000000000000000 --- a/extra/quagga/quagga-CVE-2009-1572.patch +++ /dev/null @@ -1,461 +0,0 @@ -* bgpd/bgp_aspath.c: (aspath_make_str_count) "assert (len < str_size)" was - getting hit under certain 4-byte ASN conditions. New realloc strategy. -* bgpd/bgp_aspath.c: (aspath_key_make) const warning fix. - -"%d" -> "%u" 4-byte ASN corrections. Prevent negative number when ASN is -above 2^31.: - - bgpd/bgp_attr.c - bgpd/bgp_community.c - bgpd/bgp_debug.c - bgpd/bgp_ecommunity.c - bgpd/bgp_mplsvpn.c - bgpd/bgp_packet.c - bgpd/bgp_route.c - bgpd/bgp_vty.c - bgpd/bgpd.c ---- - bgpd/bgp_aspath.c | 85 ++++++++++++++++++------------------------------- - bgpd/bgp_attr.c | 2 +- - bgpd/bgp_community.c | 2 +- - bgpd/bgp_debug.c | 2 +- - bgpd/bgp_ecommunity.c | 4 +- - bgpd/bgp_mplsvpn.c | 6 ++-- - bgpd/bgp_packet.c | 8 ++-- - bgpd/bgp_route.c | 8 ++-- - bgpd/bgp_vty.c | 20 ++++++------ - bgpd/bgpd.c | 10 +++--- - 10 files changed, 62 insertions(+), 85 deletions(-) - -diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c -index 006fc91..a1e4608 100644 ---- a/bgpd/bgp_aspath.c -+++ b/bgpd/bgp_aspath.c -@@ -393,25 +393,6 @@ aspath_delimiter_char (u_char type, u_char which) - return ' '; - } - --/* countup asns from this segment and index onward */ --static int --assegment_count_asns (struct assegment *seg, int from) --{ -- int count = 0; -- while (seg) -- { -- if (!from) -- count += seg->length; -- else -- { -- count += (seg->length - from); -- from = 0; -- } -- seg = seg->next; -- } -- return count; --} -- - unsigned int - aspath_count_confeds (struct aspath *aspath) - { -@@ -521,6 +502,21 @@ aspath_count_numas (struct aspath *aspath) - return num; - } - -+static void -+aspath_make_str_big_enough (int len, -+ char **str_buf, -+ int *str_size, -+ int count_to_be_added) -+{ -+#define TERMINATOR 1 -+ while (len + count_to_be_added + TERMINATOR > *str_size) -+ { -+ *str_size *= 2; -+ *str_buf = XREALLOC (MTYPE_AS_STR, *str_buf, *str_size); -+ } -+#undef TERMINATOR -+} -+ - /* Convert aspath structure to string expression. */ - static char * - aspath_make_str_count (struct aspath *as) -@@ -540,18 +536,7 @@ aspath_make_str_count (struct aspath *as) - - seg = as->segments; - -- /* ASN takes 5 chars at least, plus seperator, see below. -- * If there is one differing segment type, we need an additional -- * 2 chars for segment delimiters, and the final '\0'. -- * Hopefully this is large enough to avoid hitting the realloc -- * code below for most common sequences. -- * -- * With 32bit ASNs, this range will increase, but only worth changing -- * once there are significant numbers of ASN >= 100000 -- */ --#define ASN_STR_LEN (5 + 1) -- str_size = MAX (assegment_count_asns (seg, 0) * ASN_STR_LEN + 2 + 1, -- ASPATH_STR_DEFAULT_LEN); -+ str_size = ASPATH_STR_DEFAULT_LEN; - str_buf = XMALLOC (MTYPE_AS_STR, str_size); - - while (seg) -@@ -575,32 +560,24 @@ aspath_make_str_count (struct aspath *as) - return NULL; - } - -- /* We might need to increase str_buf, particularly if path has -- * differing segments types, our initial guesstimate above will -- * have been wrong. need 5 chars for ASN, a seperator each and -- * potentially two segment delimiters, plus a space between each -- * segment and trailing zero. -- * -- * This may need to revised if/when significant numbers of -- * ASNs >= 100000 are assigned and in-use on the internet... -- */ --#define SEGMENT_STR_LEN(X) (((X)->length * ASN_STR_LEN) + 2 + 1 + 1) -- if ( (len + SEGMENT_STR_LEN(seg)) > str_size) -- { -- str_size = len + SEGMENT_STR_LEN(seg); -- str_buf = XREALLOC (MTYPE_AS_STR, str_buf, str_size); -- } --#undef ASN_STR_LEN --#undef SEGMENT_STR_LEN -- - if (seg->type != AS_SEQUENCE) -- len += snprintf (str_buf + len, str_size - len, -- "%c", -- aspath_delimiter_char (seg->type, AS_SEG_START)); -+ { -+ aspath_make_str_big_enough (len, &str_buf, &str_size, 1); /* %c */ -+ len += snprintf (str_buf + len, str_size - len, -+ "%c", -+ aspath_delimiter_char (seg->type, AS_SEG_START)); -+ } - - /* write out the ASNs, with their seperators, bar the last one*/ - for (i = 0; i < seg->length; i++) - { -+#define APPROX_DIG_CNT(x) (x < 100000U ? 5 : 10) -+ /* %u + %c + %c + " " (last two are below loop) */ -+ aspath_make_str_big_enough (len, -+ &str_buf, -+ &str_size, -+ APPROX_DIG_CNT(seg->as[i]) + 1 + 1 + 1); -+ - len += snprintf (str_buf + len, str_size - len, "%u", seg->as[i]); - - if (i < (seg->length - 1)) -@@ -1771,8 +1748,8 @@ aspath_key_make (void *p) - static int - aspath_cmp (const void *arg1, const void *arg2) - { -- const struct assegment *seg1 = ((struct aspath *)arg1)->segments; -- const struct assegment *seg2 = ((struct aspath *)arg2)->segments; -+ const struct assegment *seg1 = ((const struct aspath *)arg1)->segments; -+ const struct assegment *seg2 = ((const struct aspath *)arg2)->segments; - - while (seg1 || seg2) - { -diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c -index d116c30..f38db41 100644 ---- a/bgpd/bgp_attr.c -+++ b/bgpd/bgp_attr.c -@@ -857,7 +857,7 @@ static int bgp_attr_aspath_check( struct peer *peer, - && ! aspath_firstas_check (attr->aspath, peer->as)) - { - zlog (peer->log, LOG_ERR, -- "%s incorrect first AS (must be %d)", peer->host, peer->as); -+ "%s incorrect first AS (must be %u)", peer->host, peer->as); - bgp_notify_send (peer, - BGP_NOTIFY_UPDATE_ERR, - BGP_NOTIFY_UPDATE_MAL_AS_PATH); -diff --git a/bgpd/bgp_community.c b/bgpd/bgp_community.c -index 1cafdb3..a05ea6c 100644 ---- a/bgpd/bgp_community.c -+++ b/bgpd/bgp_community.c -@@ -282,7 +282,7 @@ community_com2str (struct community *com) - default: - as = (comval >> 16) & 0xFFFF; - val = comval & 0xFFFF; -- sprintf (pnt, "%d:%d", as, val); -+ sprintf (pnt, "%u:%d", as, val); - pnt += strlen (pnt); - break; - } -diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c -index 757b9cf..1d5bf6b 100644 ---- a/bgpd/bgp_debug.c -+++ b/bgpd/bgp_debug.c -@@ -205,7 +205,7 @@ bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size) - snprintf (buf + strlen (buf), size - strlen (buf), ", atomic-aggregate"); - - if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR))) -- snprintf (buf + strlen (buf), size - strlen (buf), ", aggregated by %d %s", -+ snprintf (buf + strlen (buf), size - strlen (buf), ", aggregated by %u %s", - attr->extra->aggregator_as, - inet_ntoa (attr->extra->aggregator_addr)); - -diff --git a/bgpd/bgp_ecommunity.c b/bgpd/bgp_ecommunity.c -index c08673c..27c3cd6 100644 ---- a/bgpd/bgp_ecommunity.c -+++ b/bgpd/bgp_ecommunity.c -@@ -673,7 +673,7 @@ ecommunity_ecom2str (struct ecommunity *ecom, int format) - eas.val = (*pnt++ << 8); - eas.val |= (*pnt++); - -- len = sprintf( str_buf + str_pnt, "%s%d:%d", prefix, -+ len = sprintf( str_buf + str_pnt, "%s%u:%d", prefix, - eas.as, eas.val ); - str_pnt += len; - first = 0; -@@ -688,7 +688,7 @@ ecommunity_ecom2str (struct ecommunity *ecom, int format) - eas.val |= (*pnt++ << 8); - eas.val |= (*pnt++); - -- len = sprintf (str_buf + str_pnt, "%s%d:%d", prefix, -+ len = sprintf (str_buf + str_pnt, "%s%u:%d", prefix, - eas.as, eas.val); - str_pnt += len; - first = 0; -diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c -index ac90f3c..72ad089 100644 ---- a/bgpd/bgp_mplsvpn.c -+++ b/bgpd/bgp_mplsvpn.c -@@ -265,7 +265,7 @@ prefix_rd2str (struct prefix_rd *prd, char *buf, size_t size) - if (type == RD_TYPE_AS) - { - decode_rd_as (pnt + 2, &rd_as); -- snprintf (buf, size, "%d:%d", rd_as.as, rd_as.val); -+ snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val); - return buf; - } - else if (type == RD_TYPE_IP) -@@ -371,7 +371,7 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, struct prefix_rd *prd) - vty_out (vty, "Route Distinguisher: "); - - if (type == RD_TYPE_AS) -- vty_out (vty, "%d:%d", rd_as.as, rd_as.val); -+ vty_out (vty, "%u:%d", rd_as.as, rd_as.val); - else if (type == RD_TYPE_IP) - vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val); - -@@ -478,7 +478,7 @@ bgp_show_mpls_vpn (struct vty *vty, struct prefix_rd *prd, enum bgp_show_type ty - vty_out (vty, "Route Distinguisher: "); - - if (type == RD_TYPE_AS) -- vty_out (vty, "%d:%d", rd_as.as, rd_as.val); -+ vty_out (vty, "%u:%d", rd_as.as, rd_as.val); - else if (type == RD_TYPE_IP) - vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val); - -diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c -index 1422bad..de02bb8 100644 ---- a/bgpd/bgp_packet.c -+++ b/bgpd/bgp_packet.c -@@ -813,7 +813,7 @@ bgp_open_send (struct peer *peer) - length = bgp_packet_set_size (s); - - if (BGP_DEBUG (normal, NORMAL)) -- zlog_debug ("%s sending OPEN, version %d, my as %d, holdtime %d, id %s", -+ zlog_debug ("%s sending OPEN, version %d, my as %u, holdtime %d, id %s", - peer->host, BGP_VERSION_4, local_as, - send_holdtime, inet_ntoa (peer->local_id)); - -@@ -1184,7 +1184,7 @@ bgp_open_receive (struct peer *peer, bgp_size_t size) - - /* Receive OPEN message log */ - if (BGP_DEBUG (normal, NORMAL)) -- zlog_debug ("%s rcv OPEN, version %d, remote-as (in open) %d," -+ zlog_debug ("%s rcv OPEN, version %d, remote-as (in open) %u," - " holdtime %d, id %s", - peer->host, version, remote_as, holdtime, - inet_ntoa (remote_id)); -@@ -1277,7 +1277,7 @@ bgp_open_receive (struct peer *peer, bgp_size_t size) - else - { - if (BGP_DEBUG (normal, NORMAL)) -- zlog_debug ("%s bad OPEN, remote AS is %d, expected %d", -+ zlog_debug ("%s bad OPEN, remote AS is %u, expected %u", - peer->host, remote_as, peer->as); - bgp_notify_send_with_data (peer, BGP_NOTIFY_OPEN_ERR, - BGP_NOTIFY_OPEN_BAD_PEER_AS, -@@ -1431,7 +1431,7 @@ bgp_open_receive (struct peer *peer, bgp_size_t size) - if (remote_as != peer->as) - { - if (BGP_DEBUG (normal, NORMAL)) -- zlog_debug ("%s bad OPEN, remote AS is %d, expected %d", -+ zlog_debug ("%s bad OPEN, remote AS is %u, expected %u", - peer->host, remote_as, peer->as); - bgp_notify_send_with_data (peer, - BGP_NOTIFY_OPEN_ERR, -diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c -index 50407e4..6b7828c 100644 ---- a/bgpd/bgp_route.c -+++ b/bgpd/bgp_route.c -@@ -834,7 +834,7 @@ bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p, - { - if (BGP_DEBUG (filter, FILTER)) - zlog (peer->log, LOG_DEBUG, -- "%s [Update:SEND] suppress announcement to peer AS %d is AS path.", -+ "%s [Update:SEND] suppress announcement to peer AS %u is AS path.", - peer->host, peer->as); - return 0; - } -@@ -847,7 +847,7 @@ bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p, - { - if (BGP_DEBUG (filter, FILTER)) - zlog (peer->log, LOG_DEBUG, -- "%s [Update:SEND] suppress announcement to peer AS %d is AS path.", -+ "%s [Update:SEND] suppress announcement to peer AS %u is AS path.", - peer->host, - bgp->confed_id); - return 0; -@@ -1163,7 +1163,7 @@ bgp_announce_check_rsclient (struct bgp_info *ri, struct peer *rsclient, - { - if (BGP_DEBUG (filter, FILTER)) - zlog (rsclient->log, LOG_DEBUG, -- "%s [Update:SEND] suppress announcement to peer AS %d is AS path.", -+ "%s [Update:SEND] suppress announcement to peer AS %u is AS path.", - rsclient->host, rsclient->as); - return 0; - } -@@ -5956,7 +5956,7 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p, - if (CHECK_FLAG (binfo->flags, BGP_INFO_STALE)) - vty_out (vty, ", (stale)"); - if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR))) -- vty_out (vty, ", (aggregated by %d %s)", -+ vty_out (vty, ", (aggregated by %u %s)", - attr->extra->aggregator_as, - inet_ntoa (attr->extra->aggregator_addr)); - if (CHECK_FLAG (binfo->peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT)) -diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c -index bd94c66..96719a1 100644 ---- a/bgpd/bgp_vty.c -+++ b/bgpd/bgp_vty.c -@@ -360,11 +360,11 @@ DEFUN (router_bgp, - VTY_NEWLINE); - return CMD_WARNING; - case BGP_ERR_AS_MISMATCH: -- vty_out (vty, "BGP is already running; AS is %d%s", as, VTY_NEWLINE); -+ vty_out (vty, "BGP is already running; AS is %u%s", as, VTY_NEWLINE); - return CMD_WARNING; - case BGP_ERR_INSTANCE_MISMATCH: - vty_out (vty, "BGP view name and AS number mismatch%s", VTY_NEWLINE); -- vty_out (vty, "BGP instance is already running; AS is %d%s", -+ vty_out (vty, "BGP instance is already running; AS is %u%s", - as, VTY_NEWLINE); - return CMD_WARNING; - } -@@ -1306,10 +1306,10 @@ peer_remote_as_vty (struct vty *vty, const char *peer_str, - switch (ret) - { - case BGP_ERR_PEER_GROUP_MEMBER: -- vty_out (vty, "%% Peer-group AS %d. Cannot configure remote-as for member%s", as, VTY_NEWLINE); -+ vty_out (vty, "%% Peer-group AS %u. Cannot configure remote-as for member%s", as, VTY_NEWLINE); - return CMD_WARNING; - case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT: -- vty_out (vty, "%% The AS# can not be changed from %d to %s, peer-group members must be all internal or all external%s", as, as_str, VTY_NEWLINE); -+ vty_out (vty, "%% The AS# can not be changed from %u to %s, peer-group members must be all internal or all external%s", as, as_str, VTY_NEWLINE); - return CMD_WARNING; - } - return bgp_vty_return (vty, ret); -@@ -1647,7 +1647,7 @@ DEFUN (neighbor_set_peer_group, - - if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT) - { -- vty_out (vty, "%% Peer with AS %d cannot be in this peer-group, members must be all internal or all external%s", as, VTY_NEWLINE); -+ vty_out (vty, "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external%s", as, VTY_NEWLINE); - return CMD_WARNING; - } - -@@ -6912,7 +6912,7 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi) - - /* Usage summary and header */ - vty_out (vty, -- "BGP router identifier %s, local AS number %d%s", -+ "BGP router identifier %s, local AS number %u%s", - inet_ntoa (bgp->router_id), bgp->as, VTY_NEWLINE); - - ents = bgp_table_count (bgp->rib[afi][safi]); -@@ -6959,7 +6959,7 @@ bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi) - - vty_out (vty, "4 "); - -- vty_out (vty, "%5d %7d %7d %8d %4d %4lu ", -+ vty_out (vty, "%5u %7d %7d %8d %4d %4lu ", - peer->as, - peer->open_in + peer->update_in + peer->keepalive_in - + peer->notify_in + peer->refresh_in + peer->dynamic_cap_in, -@@ -7469,8 +7469,8 @@ bgp_show_peer (struct vty *vty, struct peer *p) - - /* Configured IP address. */ - vty_out (vty, "BGP neighbor is %s, ", p->host); -- vty_out (vty, "remote AS %d, ", p->as); -- vty_out (vty, "local AS %d%s, ", -+ vty_out (vty, "remote AS %u, ", p->as); -+ vty_out (vty, "local AS %u%s, ", - p->change_local_as ? p->change_local_as : p->local_as, - CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ? - " no-prepend" : ""); -@@ -8252,7 +8252,7 @@ bgp_show_rsclient_summary (struct vty *vty, struct bgp *bgp, - "Route Server's BGP router identifier %s%s", - inet_ntoa (bgp->router_id), VTY_NEWLINE); - vty_out (vty, -- "Route Server's local AS number %d%s", bgp->as, -+ "Route Server's local AS number %u%s", bgp->as, - VTY_NEWLINE); - - vty_out (vty, "%s", VTY_NEWLINE); -diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c -index 8eb0d2e..cebde0a 100644 ---- a/bgpd/bgpd.c -+++ b/bgpd/bgpd.c -@@ -4512,13 +4512,13 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp, - vty_out (vty, " neighbor %s peer-group%s", addr, - VTY_NEWLINE); - if (peer->as) -- vty_out (vty, " neighbor %s remote-as %d%s", addr, peer->as, -+ vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as, - VTY_NEWLINE); - } - else - { - if (! g_peer->as) -- vty_out (vty, " neighbor %s remote-as %d%s", addr, peer->as, -+ vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as, - VTY_NEWLINE); - if (peer->af_group[AFI_IP][SAFI_UNICAST]) - vty_out (vty, " neighbor %s peer-group %s%s", addr, -@@ -4528,7 +4528,7 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp, - /* local-as. */ - if (peer->change_local_as) - if (! peer_group_active (peer)) -- vty_out (vty, " neighbor %s local-as %d%s%s", addr, -+ vty_out (vty, " neighbor %s local-as %u%s%s", addr, - peer->change_local_as, - CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ? - " no-prepend" : "", VTY_NEWLINE); -@@ -4917,7 +4917,7 @@ bgp_config_write (struct vty *vty) - vty_out (vty, "!%s", VTY_NEWLINE); - - /* Router bgp ASN */ -- vty_out (vty, "router bgp %d", bgp->as); -+ vty_out (vty, "router bgp %u", bgp->as); - - if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE)) - { -@@ -4978,7 +4978,7 @@ bgp_config_write (struct vty *vty) - vty_out (vty, " bgp confederation peers"); - - for (i = 0; i < bgp->confed_peers_cnt; i++) -- vty_out(vty, " %d", bgp->confed_peers[i]); -+ vty_out(vty, " %u", bgp->confed_peers[i]); - - vty_out (vty, "%s", VTY_NEWLINE); - } --- -1.6.0.6 -_______________________________________________ -Quagga-dev mailing list -Quagga-dev@lists.quagga.net -http://lists.quagga.net/mailman/listinfo/quagga-dev \ No newline at end of file