mp_capability = 0;
optlen = stream_getc(peer->curr);
+ /* If we previously had some more capabilities e.g.:
+ * FQDN, SOFT_VERSION, we MUST clear the values we used
+ * before, to avoid using stale data.
+ * Checking peer->cap is enough before checking for the real
+ * data, but we don't have this check everywhere in the code,
+ * thus let's clear the data here too before parsing the
+ * capabilities.
+ */
+ if (peer->hostname)
+ XFREE(MTYPE_BGP_PEER_HOST, peer->hostname);
+
+ if (peer->domainname)
+ XFREE(MTYPE_BGP_PEER_HOST, peer->domainname);
+
+ if (peer->soft_version)
+ XFREE(MTYPE_BGP_SOFT_VERSION, peer->soft_version);
+
/* Extended Optional Parameters Length for BGP OPEN Message */
if (optlen == BGP_OPEN_NON_EXT_OPT_LEN
|| CHECK_FLAG(peer->flags, PEER_FLAG_EXTENDED_OPT_PARAMS)) {