]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Fix memory leak with 'set ip next-hop peer-address'
authorJorge Boncompte [DTI2] <jorge@dti2.net>
Tue, 10 Apr 2012 14:57:22 +0000 (16:57 +0200)
committerDavid Lamparter <equinox@diac24.net>
Wed, 2 May 2012 15:03:27 +0000 (17:03 +0200)
A route-map with the mentioned statement causes a memory leak for every
prefix that matches.

Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Signed-off-by: David Lamparter <equinox@diac24.net>
bgpd/bgp_routemap.c
lib/sockunion.h

index f95cab130b5975b5840b916a44115de83c9258a0..fa645ac41139a8c8ec2ad461b4c10ca2ff2d5c34 100644 (file)
@@ -878,7 +878,6 @@ route_set_ip_nexthop (void *rule, struct prefix *prefix,
                      route_map_object_t type, void *object)
 {
   struct rmap_ip_nexthop_set *rins = rule;
-  struct in_addr peer_address;
   struct bgp_info *bgp_info;
   struct peer *peer;
 
@@ -894,16 +893,14 @@ route_set_ip_nexthop (void *rule, struct prefix *prefix,
              && peer->su_remote 
              && sockunion_family (peer->su_remote) == AF_INET)
            {
-              inet_aton (sockunion_su2str (peer->su_remote), &peer_address);
-              bgp_info->attr->nexthop = peer_address;
+             bgp_info->attr->nexthop.s_addr = sockunion2ip (peer->su_remote);
              bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
            }
          else if (CHECK_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT)
                   && peer->su_local
                   && sockunion_family (peer->su_local) == AF_INET)
            {
-              inet_aton (sockunion_su2str (peer->su_local), &peer_address);
-              bgp_info->attr->nexthop = peer_address;
+             bgp_info->attr->nexthop.s_addr = sockunion2ip (peer->su_local);
              bgp_info->attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
            }
        }
index 4531f620ab92d1b619e22c376eacd62469270335..15b97fc54faf9dd5fa820ed287ca40a03d1ed795 100644 (file)
@@ -86,6 +86,8 @@ enum connect_result
 
 #define sockunion_family(X)  (X)->sa.sa_family
 
+#define sockunion2ip(X)      (X)->sin.sin_addr.s_addr
+
 /* Prototypes. */
 extern int str2sockunion (const char *, union sockunion *);
 extern const char *sockunion2str (union sockunion *, char *, size_t);