diff options
Diffstat (limited to 'bgpd/rfapi/rfapi.c')
| -rw-r--r-- | bgpd/rfapi/rfapi.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c index 15a29442f4..fa3da9c283 100644 --- a/bgpd/rfapi/rfapi.c +++ b/bgpd/rfapi/rfapi.c @@ -1304,18 +1304,31 @@ static int rfapi_open_inner(struct rfapi_descriptor *rfd, struct bgp *bgp, rfd->peer = peer_new(bgp); rfd->peer->status = Established; /* keep bgp core happy */ bgp_sync_delete(rfd->peer); /* don't need these */ - if (rfd->peer->ibuf) { - stream_free(rfd->peer->ibuf); /* don't need it */ + + /* + * since this peer is not on the I/O thread, this lock is not strictly + * necessary, but serves as a reminder to those who may meddle... + */ + pthread_mutex_lock(&rfd->peer->io_mtx); + { + // we don't need any I/O related facilities + if (rfd->peer->ibuf) + stream_fifo_free(rfd->peer->ibuf); + if (rfd->peer->obuf) + stream_fifo_free(rfd->peer->obuf); + + if (rfd->peer->ibuf_work) + stream_free(rfd->peer->ibuf_work); + if (rfd->peer->obuf_work) + stream_free(rfd->peer->obuf_work); + rfd->peer->ibuf = NULL; - } - if (rfd->peer->obuf) { - stream_fifo_free(rfd->peer->obuf); /* don't need it */ rfd->peer->obuf = NULL; + rfd->peer->obuf_work = NULL; + rfd->peer->ibuf_work = NULL; } - if (rfd->peer->work) { - stream_free(rfd->peer->work); /* don't need it */ - rfd->peer->work = NULL; - } + pthread_mutex_unlock(&rfd->peer->io_mtx); + { /* base code assumes have valid host pointer */ char buf[BUFSIZ]; buf[0] = 0; |
