ok benno@

Remi Locherer(remi.loche...@relo.ch) on 2019.12.14 22:23:37 +0100:
> On Mon, Dec 09, 2019 at 03:16:20PM +1100, Jason Tubnor wrote:
> > On Mon, 9 Dec 2019 at 10:44, Remi Locherer <remi.loche...@relo.ch> wrote:
> > 
> > >
> > > >
> > > > I can reproduce this issue. But only when I combine the use of
> > > > "interface XY { passive }" and "redistribute connected". When I remove
> > > > the passive interfaces from ripd.conf memory consumption is stable.
> > > >
> > > > Why do you combine these configs?
> > >
> > > Below diff fixes the memory leak for me.
> > >
> > > In addition to clear r_list I also moved the check for passive interface
> > > a bit up so that the function can return as soon as possible.
> > >
> > > OK?
> > >
> > > Remi
> > >
> > >
> > >
> > >
> > This patch applied cleanly and has fixed the memory leak issue when
> > interfaces are configured 'passive'.  Tested with 1 active and 6 passive
> > interfaces on one host and with a little memory consumption on startup
> > [expected], it settled back down to 984KB of consumed RAM for 391 subnets
> > and didn't move over 1.5 hours.
> > 
> > As /cvs/src/usr.sbin/ripd/message.c hasn't been touched since 2014, this
> > patch would apply cleanly to 6.5 and 6.6 if an errata notice needed to be
> > created (I can test on these if validation is required - will just take a
> > little time to spin them up).
> > 
> > Thanks for your help Remi.
> > 
> > Cheers,
> > 
> > Jason.
> 
> Any OKs for this?
> 
> Below again the patch.
> 
> Remi
> 
> 
> 
> 
> Index: message.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ripd/message.c,v
> retrieving revision 1.12
> diff -u -p -r1.12 message.c
> --- message.c 25 Oct 2014 03:23:49 -0000      1.12
> +++ message.c 8 Dec 2019 23:35:42 -0000
> @@ -105,15 +105,15 @@ send_triggered_update(struct iface *ifac
>       u_int16_t                afi, route_tag;
>       u_int32_t                address, netmask, nexthop, metric;
>  
> +     if (iface->passive)
> +             return (0);
> +
>       inet_aton(ALL_RIP_ROUTERS, &dst.sin_addr);
>  
>       dst.sin_port = htons(RIP_PORT);
>       dst.sin_family = AF_INET;
>       dst.sin_len = sizeof(struct sockaddr_in);
>  
> -     if (iface->passive)
> -             return (0);
> -
>       if ((buf = ibuf_open(iface->mtu - sizeof(struct ip) -
>           sizeof(struct udphdr))) == NULL)
>               fatal("send_triggered_update");
> @@ -166,13 +166,15 @@ send_request(struct packet_head *r_list,
>               port = htons(RIP_PORT);
>       }
>  
> +     if (iface->passive) {
> +             clear_list(r_list);
> +             return (0);
> +     }
> +
>       dst.sin_port = port;
>       dst.sin_family = AF_INET;
>       dst.sin_len = sizeof(struct sockaddr_in);
>  
> -     if (iface->passive)
> -             return (0);
> -
>       while (!TAILQ_EMPTY(r_list)) {
>               if ((buf = ibuf_open(iface->mtu - sizeof(struct ip) -
>                   sizeof(struct udphdr))) == NULL)
> @@ -240,13 +242,15 @@ send_response(struct packet_head *r_list
>               port = htons(RIP_PORT);
>       }
>  
> +     if (iface->passive) {
> +             clear_list(r_list);
> +             return (0);
> +     }
> +
>       dst.sin_port = port;
>       dst.sin_family = AF_INET;
>       dst.sin_len = sizeof(struct sockaddr_in);
>  
> -     if (iface->passive)
> -             return (0);
> -
>       while (!TAILQ_EMPTY(r_list)) {
>               if ((buf = ibuf_open(iface->mtu - sizeof(struct ip) -
>                   sizeof(struct udphdr))) == NULL)
> 

Reply via email to