bgpd: Fix memory leak of some "show ip bgp neighbor" commands

sockunion_str2su() use is prone to memory leaks. Remove it's use all over
the code.

At least these commands leaked a sockunion union:
    - show ip bgp vpnv4 ... routes
    - show ip bgp ... received prefix-filter

Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Signed-off-by: David Lamparter <equinox@diac24.net>
This commit is contained in:
Jorge Boncompte [DTI2] 2012-04-10 16:57:24 +02:00 committed by David Lamparter
parent d227617a97
commit c63b83fe8d
6 changed files with 59 additions and 85 deletions

View File

@ -581,24 +581,25 @@ DEFUN (show_ip_bgp_vpnv4_all_neighbor_routes,
"Neighbor to display information about\n" "Neighbor to display information about\n"
"Display routes learned from neighbor\n") "Display routes learned from neighbor\n")
{ {
union sockunion *su; union sockunion su;
struct peer *peer; struct peer *peer;
int ret;
su = sockunion_str2su (argv[0]);
if (su == NULL) ret = str2sockunion (argv[0], &su);
if (ret < 0)
{ {
vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE); vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
peer = peer_lookup (NULL, su); peer = peer_lookup (NULL, &su);
if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN]) if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
{ {
vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_neighbor, su, 0); return bgp_show_mpls_vpn (vty, NULL, bgp_show_type_neighbor, &su, 0);
} }
DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes, DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
@ -615,7 +616,7 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
"Display routes learned from neighbor\n") "Display routes learned from neighbor\n")
{ {
int ret; int ret;
union sockunion *su; union sockunion su;
struct peer *peer; struct peer *peer;
struct prefix_rd prd; struct prefix_rd prd;
@ -626,21 +627,21 @@ DEFUN (show_ip_bgp_vpnv4_rd_neighbor_routes,
return CMD_WARNING; return CMD_WARNING;
} }
su = sockunion_str2su (argv[1]); ret = str2sockunion (argv[1], &su);
if (su == NULL) if (ret < 0)
{ {
vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE); vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
peer = peer_lookup (NULL, su); peer = peer_lookup (NULL, &su);
if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN]) if (! peer || ! peer->afc[AFI_IP][SAFI_MPLS_VPN])
{ {
vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE); vty_out (vty, "%% No such neighbor or address family%s", VTY_NEWLINE);
return CMD_WARNING; return CMD_WARNING;
} }
return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_neighbor, su, 0); return bgp_show_mpls_vpn (vty, &prd, bgp_show_type_neighbor, &su, 0);
} }
DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes, DEFUN (show_ip_bgp_vpnv4_all_neighbor_advertised_routes,

View File

@ -10202,15 +10202,18 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
"Display the prefixlist filter\n") "Display the prefixlist filter\n")
{ {
char name[BUFSIZ]; char name[BUFSIZ];
union sockunion *su; union sockunion su;
struct peer *peer; struct peer *peer;
int count; int count, ret;
su = sockunion_str2su (argv[0]); ret = str2sockunion (argv[0], &su);
if (su == NULL) if (ret < 0)
return CMD_WARNING; {
vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
return CMD_WARNING;
}
peer = peer_lookup (NULL, su); peer = peer_lookup (NULL, &su);
if (! peer) if (! peer)
return CMD_WARNING; return CMD_WARNING;
@ -10241,15 +10244,18 @@ DEFUN (show_ip_bgp_ipv4_neighbor_received_prefix_filter,
"Display the prefixlist filter\n") "Display the prefixlist filter\n")
{ {
char name[BUFSIZ]; char name[BUFSIZ];
union sockunion *su; union sockunion su;
struct peer *peer; struct peer *peer;
int count; int count, ret;
su = sockunion_str2su (argv[1]); ret = str2sockunion (argv[1], &su);
if (su == NULL) if (ret < 0)
return CMD_WARNING; {
vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
return CMD_WARNING;
}
peer = peer_lookup (NULL, su); peer = peer_lookup (NULL, &su);
if (! peer) if (! peer)
return CMD_WARNING; return CMD_WARNING;
@ -10312,15 +10318,18 @@ DEFUN (show_bgp_neighbor_received_prefix_filter,
"Display the prefixlist filter\n") "Display the prefixlist filter\n")
{ {
char name[BUFSIZ]; char name[BUFSIZ];
union sockunion *su; union sockunion su;
struct peer *peer; struct peer *peer;
int count; int count, ret;
su = sockunion_str2su (argv[0]); ret = str2sockunion (argv[0], &su);
if (su == NULL) if (ret < 0)
return CMD_WARNING; {
vty_out (vty, "Malformed address: %s%s", argv[0], VTY_NEWLINE);
return CMD_WARNING;
}
peer = peer_lookup (NULL, su); peer = peer_lookup (NULL, &su);
if (! peer) if (! peer)
return CMD_WARNING; return CMD_WARNING;
@ -10394,10 +10403,10 @@ DEFUN (show_bgp_view_neighbor_received_prefix_filter,
"Display the prefixlist filter\n") "Display the prefixlist filter\n")
{ {
char name[BUFSIZ]; char name[BUFSIZ];
union sockunion *su; union sockunion su;
struct peer *peer; struct peer *peer;
struct bgp *bgp; struct bgp *bgp;
int count; int count, ret;
/* BGP structure lookup. */ /* BGP structure lookup. */
bgp = bgp_lookup_by_name (argv[0]); bgp = bgp_lookup_by_name (argv[0]);
@ -10407,11 +10416,14 @@ DEFUN (show_bgp_view_neighbor_received_prefix_filter,
return CMD_WARNING; return CMD_WARNING;
} }
su = sockunion_str2su (argv[1]); ret = str2sockunion (argv[1], &su);
if (su == NULL) if (ret < 0)
return CMD_WARNING; {
vty_out (vty, "Malformed address: %s%s", argv[1], VTY_NEWLINE);
return CMD_WARNING;
}
peer = peer_lookup (bgp, su); peer = peer_lookup (bgp, &su);
if (! peer) if (! peer)
return CMD_WARNING; return CMD_WARNING;

View File

@ -111,7 +111,8 @@ route_match_peer (void *rule, struct prefix *prefix, route_map_object_t type,
void *object) void *object)
{ {
union sockunion *su; union sockunion *su;
union sockunion *su2; union sockunion su_def = { .sa.sa_family = AF_INET,
.sin.sin_addr.s_addr = INADDR_ANY };
struct peer_group *group; struct peer_group *group;
struct peer *peer; struct peer *peer;
struct listnode *node, *nnode; struct listnode *node, *nnode;
@ -127,8 +128,7 @@ route_match_peer (void *rule, struct prefix *prefix, route_map_object_t type,
/* If su='0.0.0.0' (command 'match peer local'), and it's a NETWORK, /* If su='0.0.0.0' (command 'match peer local'), and it's a NETWORK,
REDISTRIBUTE or DEFAULT_GENERATED route => return RMAP_MATCH */ REDISTRIBUTE or DEFAULT_GENERATED route => return RMAP_MATCH */
su2 = sockunion_str2su ("0.0.0.0"); if (sockunion_same (su, &su_def))
if ( sockunion_same (su, su2) )
{ {
int ret; int ret;
if ( CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_NETWORK) || if ( CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_NETWORK) ||
@ -137,12 +137,9 @@ route_match_peer (void *rule, struct prefix *prefix, route_map_object_t type,
ret = RMAP_MATCH; ret = RMAP_MATCH;
else else
ret = RMAP_NOMATCH; ret = RMAP_NOMATCH;
sockunion_free (su2);
return ret; return ret;
} }
sockunion_free (su2);
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)) if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{ {
if (sockunion_same (su, &peer->su)) if (sockunion_same (su, &peer->su))

View File

@ -2943,7 +2943,6 @@ peer_update_source_vty (struct vty *vty, const char *peer_str,
const char *source_str) const char *source_str)
{ {
struct peer *peer; struct peer *peer;
union sockunion *su;
peer = peer_and_group_lookup_vty (vty, peer_str); peer = peer_and_group_lookup_vty (vty, peer_str);
if (! peer) if (! peer)
@ -2951,12 +2950,11 @@ peer_update_source_vty (struct vty *vty, const char *peer_str,
if (source_str) if (source_str)
{ {
su = sockunion_str2su (source_str); union sockunion su;
if (su) int ret = str2sockunion (source_str, &su);
{
peer_update_source_addr_set (peer, su); if (ret == 0)
sockunion_free (su); peer_update_source_addr_set (peer, &su);
}
else else
peer_update_source_if_set (peer, source_str); peer_update_source_if_set (peer, source_str);
} }

View File

@ -174,39 +174,6 @@ sockunion2str (union sockunion *su, char *buf, size_t len)
return NULL; return NULL;
} }
union sockunion *
sockunion_str2su (const char *str)
{
int ret;
union sockunion *su;
su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));
ret = inet_pton (AF_INET, str, &su->sin.sin_addr);
if (ret > 0) /* Valid IPv4 address format. */
{
su->sin.sin_family = AF_INET;
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
su->sin.sin_len = sizeof(struct sockaddr_in);
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
return su;
}
#ifdef HAVE_IPV6
ret = inet_pton (AF_INET6, str, &su->sin6.sin6_addr);
if (ret > 0) /* Valid IPv6 address format. */
{
su->sin6.sin6_family = AF_INET6;
#ifdef SIN6_LEN
su->sin6.sin6_len = sizeof(struct sockaddr_in6);
#endif /* SIN6_LEN */
return su;
}
#endif /* HAVE_IPV6 */
XFREE (MTYPE_SOCKUNION, su);
return NULL;
}
/* Convert IPv4 compatible IPv6 address to IPv4 address. */ /* Convert IPv4 compatible IPv6 address to IPv4 address. */
static void static void
sockunion_normalise_mapped (union sockunion *su) sockunion_normalise_mapped (union sockunion *su)

View File

@ -94,7 +94,6 @@ extern const char *sockunion2str (union sockunion *, char *, size_t);
extern int sockunion_cmp (union sockunion *, union sockunion *); extern int sockunion_cmp (union sockunion *, union sockunion *);
extern int sockunion_same (union sockunion *, union sockunion *); extern int sockunion_same (union sockunion *, union sockunion *);
extern union sockunion *sockunion_str2su (const char *str);
extern struct in_addr sockunion_get_in_addr (union sockunion *su); extern struct in_addr sockunion_get_in_addr (union sockunion *su);
extern int sockunion_accept (int sock, union sockunion *); extern int sockunion_accept (int sock, union sockunion *);
extern int sockunion_stream_socket (union sockunion *); extern int sockunion_stream_socket (union sockunion *);