Hi,
we allocate the wrong size here i think.
ok?
(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;
}
}