git: dc2c49ff3210 - main - net/frr8: Fix bgpd crash with large communities and enable backtrace
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 21 Apr 2023 22:08:14 UTC
The branch main has been updated by olivier:
URL: https://cgit.FreeBSD.org/ports/commit/?id=dc2c49ff321068aacbb763d951f301b90094958b
commit dc2c49ff321068aacbb763d951f301b90094958b
Author: Olivier Cochard <olivier@FreeBSD.org>
AuthorDate: 2023-04-21 21:25:25 +0000
Commit: Olivier Cochard <olivier@FreeBSD.org>
CommitDate: 2023-04-21 21:34:01 +0000
net/frr8: Fix bgpd crash with large communities and enable backtrace
PR: 270910
Reported by: pi
---
net/frr8/Makefile | 14 +++++-----
net/frr8/files/patch-bgpd_bgp__lcommunity.c | 42 +++++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/net/frr8/Makefile b/net/frr8/Makefile
index 610fdeeb6edb..acdfa1ea0581 100644
--- a/net/frr8/Makefile
+++ b/net/frr8/Makefile
@@ -1,6 +1,7 @@
PORTNAME= frr
PORTVERSION= 8.5
DISTVERSIONPREFIX= frr-
+PORTREVISION= 1
CATEGORIES= net
.if defined(PYTHONTOOLS)
PKGNAMESUFFIX= 8-pythontools
@@ -67,16 +68,17 @@ PKGMESSAGE= ""
.else
INFO= frr
-OPTIONS_DEFINE= CONFIGROLLBACKS FPM DATACENTER LDPD PAM SHELLACCESS \
+OPTIONS_DEFINE= BACKTRACE CONFIGROLLBACKS FPM DATACENTER LDPD PAM SHELLACCESS \
VTYSH MANPAGES MULTIPATH TCMALLOC RPKI SHARPD SNMP
-OPTIONS_DEFAULT= VTYSH RPKI FPM MANPAGES
+OPTIONS_DEFAULT= BACKTRACE VTYSH RPKI FPM MANPAGES
OPTIONS_SUB= yes
+BACKTRACE_DESC= Enable backtrace
CONFIGROLLBACKS_DESC= Enable configuration rollback support
FPM_DESC= Enable Forwarding Plane Manager support
DATACENTER_DESC= Use reduced BGP timers
LDPD_DESC= Build ldpd
-MULTIPATH_DESC= Enable multipath function
+MULTIPATH_DESC= Allow 64 multipath routes (16 default)
PAM_DESC= Use libpam for PAM support in vtysh
RPKI_DESC= Add BGP RPKI (RFC 6810) support
SHELLACCESS_DESC= Allow users to access shell/telnet/ssh
@@ -91,23 +93,23 @@ GROUPS= frr frrvty
CPPFLAGS+= -I${LOCALBASE}/include
LDFLAGS+= -L${LOCALBASE}/lib
-# PIM compile but didn't work on FreeBSD
+# PIM compile but doesn't work on FreeBSD
CONFIGURE_ARGS= --enable-user=frr \
--enable-group=frr \
--enable-vty-group=frrvty \
--disable-doc-html \
--sysconfdir=${ETCDIR} \
--localstatedir=/var/run/frr \
- --disable-backtrace \
--disable-nhrpd \
--disable-pathd \
--disable-ospfclient \
--disable-pimd \
- --disable-vrrpd \
--with-vtysh-pager=cat
MANPAGES_BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}sphinx>=0,1:textproc/py-sphinx@${PY_FLAVOR}
MANPAGES_CONFIGURE_OFF= --disable-doc
+BACKTRACE_LIB_DEPENDS= libunwind.so:devel/libunwind
+BACKTRACE_CONFIGURE_ENABLE= backtrace
CONFIGROLLBACKS_LIB_DEPENDS= libsqlite3.so:databases/sqlite3
CONFIGROLLBACKS_CONFIGURE_ENABLE= config-rollbacks
DATACENTER_CONFIGURE_ENABLE= datacenter
diff --git a/net/frr8/files/patch-bgpd_bgp__lcommunity.c b/net/frr8/files/patch-bgpd_bgp__lcommunity.c
new file mode 100644
index 000000000000..9f8566cea61d
--- /dev/null
+++ b/net/frr8/files/patch-bgpd_bgp__lcommunity.c
@@ -0,0 +1,42 @@
+--- bgpd/bgp_lcommunity.c.orig 2023-03-13 14:01:47 UTC
++++ bgpd/bgp_lcommunity.c
+@@ -211,12 +211,13 @@ static void set_lcommunity_string(struct lcommunity *l
+ }
+
+ /* 1 space + lcom->size lcom strings + null terminator */
+- size_t str_buf_sz = BUFSIZ;
++ size_t str_buf_sz = (LCOMMUNITY_STRLEN * lcom->size) + 2;
+ str_buf = XCALLOC(MTYPE_LCOMMUNITY_STR, str_buf_sz);
+
++ len = 0;
+ for (i = 0; i < lcom->size; i++) {
+ if (i > 0)
+- strlcat(str_buf, " ", str_buf_sz);
++ len = strlcat(str_buf, " ", str_buf_sz);
+
+ pnt = lcom->val + (i * LCOMMUNITY_SIZE);
+ pnt = ptr_get_be32(pnt, &global);
+@@ -229,11 +230,22 @@ static void set_lcommunity_string(struct lcommunity *l
+ snprintf(lcsb, sizeof(lcsb), "%u:%u:%u", global, local1,
+ local2);
+
++ /*
++ * Aliases can cause havoc, if the alias length is greater
++ * than the LCOMMUNITY_STRLEN for a particular item
++ * then we need to realloc the memory associated
++ * with the string so that it can fit
++ */
+ const char *com2alias =
+ translate_alias ? bgp_community2alias(lcsb) : lcsb;
++ size_t individual_len = strlen(com2alias);
++ if (individual_len + len > str_buf_sz) {
++ str_buf_sz = individual_len + len + 1;
++ str_buf = XREALLOC(MTYPE_LCOMMUNITY_STR, str_buf,
++ str_buf_sz);
++ }
+
+ len = strlcat(str_buf, com2alias, str_buf_sz);
+- assert((unsigned int)len < str_buf_sz);
+
+ if (make_json) {
+ json_string = json_object_new_string(com2alias);