On Wed, Sep 25, 2019 at 10:34:53PM +0200, Tobias Heider wrote: > Thanks, makes sense. Not sure how I didn't think of this. > Here is a cleaned up version:
OK bluhm@ > Index: parse.y > =================================================================== > RCS file: /cvs/src/sbin/iked/parse.y,v > retrieving revision 1.83 > diff -u -p -u -r1.83 parse.y > --- parse.y 26 Aug 2019 16:41:08 -0000 1.83 > +++ parse.y 25 Sep 2019 20:28:31 -0000 > @@ -354,10 +354,13 @@ int get_id_type(char *); > uint8_t x2i(unsigned char *); > int parsekey(unsigned char *, size_t, struct iked_auth *); > int parsekeyfile(char *, struct iked_auth *); > +void iaw_free(struct ipsec_addr_wrap *); > > struct ipsec_transforms *ipsec_transforms; > struct ipsec_filters *ipsec_filters; > struct ipsec_mode *ipsec_mode; > +/* interface lookup routintes */ > +struct ipsec_addr_wrap *iftab; > > typedef struct { > union { > @@ -1630,6 +1633,9 @@ parse_config(const char *filename, struc > free(sym); > } > > + iaw_free(iftab); > + iftab = NULL; > + > return (errors ? -1 : 0); > } > > @@ -2184,10 +2190,6 @@ host_any(void) > return (ipa); > } > > -/* interface lookup routintes */ > - > -struct ipsec_addr_wrap *iftab; > - > void > ifa_load(void) > { > @@ -3040,7 +3042,17 @@ done: > free(p->prop_xforms); > free(p); > } > - > + if (peers != NULL) { > + iaw_free(peers->src); > + iaw_free(peers->dst); > + /* peers is static, cannot be freed */ > + } > + if (hosts != NULL) { > + iaw_free(hosts->src); > + iaw_free(hosts->dst); > + free(hosts); > + } > + iaw_free(ikecfg); > return (ret); > } > > @@ -3066,4 +3078,24 @@ create_user(const char *user, const char > > rules++; > return (0); > +} > + > +void > +iaw_free(struct ipsec_addr_wrap *head) > +{ > + struct ipsec_addr_wrap *n, *cur; > + > + if (head == NULL) > + return; > + > + for (n = head; n != NULL; ) { > + cur = n; > + n = n->next; > + if (cur->srcnat != NULL) { > + free(cur->srcnat->name); > + free(cur->srcnat); > + } > + free(cur->name); > + free(cur); > + } > }