On Sat, Dec 29, 2018 at 08:24:50PM +0100, Sebastian Benoit wrote: > Hi, > > we allocate the wrong size here i think. > > ok?
No, this diff is wrong. Check out the parse.y code. It uses MRT2MC to access fields in struct mrt_config. I know this is not the best style but it is currently correct. > (benno_bgpd_mrt.diff) > > diff --git usr.sbin/bgpd/mrt.c usr.sbin/bgpd/mrt.c > index 7c7f2193db3..2502c792c55 100644 > --- usr.sbin/bgpd/mrt.c > +++ usr.sbin/bgpd/mrt.c > @@ -976,43 +976,43 @@ mrt_get(struct mrt_head *c, struct mrt *m) > if (t->type != m->type) > continue; > if (strcmp(t->rib, m->rib)) > continue; > if (t->peer_id == m->peer_id && > t->group_id == m->group_id) > return (t); > } > return (NULL); > } > > int > mrt_mergeconfig(struct mrt_head *xconf, struct mrt_head *nconf) > { > struct mrt *m, *xm; > > /* both lists here are actually struct mrt_conifg nodes */ > LIST_FOREACH(m, nconf, entry) { > if ((xm = mrt_get(xconf, m)) == NULL) { > /* NEW */ > - if ((xm = malloc(sizeof(struct mrt_config))) == NULL) > + if ((xm = malloc(sizeof(struct mrt))) == NULL) > fatal("mrt_mergeconfig"); > - memcpy(xm, m, sizeof(struct mrt_config)); > + memcpy(xm, m, sizeof(*xm)); > xm->state = MRT_STATE_OPEN; > LIST_INSERT_HEAD(xconf, xm, entry); > } else { > /* MERGE */ > if (strlcpy(MRT2MC(xm)->name, MRT2MC(m)->name, > sizeof(MRT2MC(xm)->name)) >= > sizeof(MRT2MC(xm)->name)) > fatalx("mrt_mergeconfig: strlcpy"); > MRT2MC(xm)->ReopenTimerInterval = > MRT2MC(m)->ReopenTimerInterval; > xm->state = MRT_STATE_REOPEN; > } > } > > LIST_FOREACH(xm, xconf, entry) > if (mrt_get(nconf, xm) == NULL) > /* REMOVE */ > xm->state = MRT_STATE_REMOVE; > > /* free config */ > diff --git usr.sbin/bgpd/parse.y usr.sbin/bgpd/parse.y > index 984a1639300..272475fe6e4 100644 > --- usr.sbin/bgpd/parse.y > +++ usr.sbin/bgpd/parse.y > @@ -3809,41 +3809,41 @@ add_mrtconfig(enum mrt_type type, char *name, int > timeout, struct peer *p, > struct mrt *m, *n; > > LIST_FOREACH(m, conf->mrt, entry) { > if ((rib && strcmp(rib, m->rib)) || > (!rib && *m->rib)) > continue; > if (p == NULL) { > if (m->peer_id != 0 || m->group_id != 0) > continue; > } else { > if (m->peer_id != p->conf.id || > m->group_id != p->conf.groupid) > continue; > } > if (m->type == type) { > yyerror("only one mrtdump per type allowed."); > return (-1); > } > } > > - if ((n = calloc(1, sizeof(struct mrt_config))) == NULL) > + if ((n = calloc(1, sizeof(struct mrt))) == NULL) > fatal("add_mrtconfig"); > > n->type = type; > if (strlcpy(MRT2MC(n)->name, name, sizeof(MRT2MC(n)->name)) >= > sizeof(MRT2MC(n)->name)) { > yyerror("filename \"%s\" too long: max %zu", > name, sizeof(MRT2MC(n)->name) - 1); > free(n); > return (-1); > } > MRT2MC(n)->ReopenTimerInterval = timeout; > if (p != NULL) { > if (curgroup == p) { > n->peer_id = 0; > n->group_id = p->conf.id; > } else { > n->peer_id = p->conf.id; > n->group_id = 0; > } > } > -- :wq Claudio