lib, ldpd: fix SA warnings from TAILQ oddness

Add a TAILQ_POP_FIRST so Clang understands it's the same item that is
getting removed from the list.

Signed-off-by: David Lamparter <equinox@diac24.net>
This commit is contained in:
David Lamparter 2018-09-08 19:25:00 +02:00
parent 6317894ef3
commit a43ad4fef8
4 changed files with 25 additions and 14 deletions

View File

@ -1620,10 +1620,8 @@ lde_address_list_free(struct lde_nbr *ln)
{
struct lde_addr *lde_addr;
while ((lde_addr = TAILQ_FIRST(&ln->addr_list)) != NULL) {
TAILQ_REMOVE(&ln->addr_list, lde_addr, entry);
while ((lde_addr = TAILQ_POP_FIRST(&ln->addr_list, entry)) != NULL)
free(lde_addr);
}
}
static void zclient_sync_init(unsigned short instance)

View File

@ -21,9 +21,9 @@
#include "queue.h"
#include "imsg.h"
int ibuf_realloc(struct ibuf *, size_t);
void ibuf_enqueue(struct msgbuf *, struct ibuf *);
void ibuf_dequeue(struct msgbuf *, struct ibuf *);
static int ibuf_realloc(struct ibuf *, size_t);
static void ibuf_enqueue(struct msgbuf *, struct ibuf *);
static void ibuf_dequeue(struct msgbuf *, struct ibuf *);
struct ibuf *ibuf_open(size_t len)
{
@ -57,7 +57,7 @@ struct ibuf *ibuf_dynamic(size_t len, size_t max)
return (buf);
}
int ibuf_realloc(struct ibuf *buf, size_t len)
static int ibuf_realloc(struct ibuf *buf, size_t len)
{
uint8_t *b;
@ -183,6 +183,8 @@ void msgbuf_drain(struct msgbuf *msgbuf, size_t n)
next = TAILQ_NEXT(buf, entry);
if (buf->rpos + n >= buf->wpos) {
n -= buf->wpos - buf->rpos;
TAILQ_REMOVE(&msgbuf->bufs, buf, entry);
ibuf_dequeue(msgbuf, buf);
} else {
buf->rpos += n;
@ -195,7 +197,7 @@ void msgbuf_clear(struct msgbuf *msgbuf)
{
struct ibuf *buf;
while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL)
while ((buf = TAILQ_POP_FIRST(&msgbuf->bufs, entry)) != NULL)
ibuf_dequeue(msgbuf, buf);
}
@ -266,16 +268,15 @@ again:
return (1);
}
void ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf)
static void ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf)
{
TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entry);
msgbuf->queued++;
}
void ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf)
static void ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf)
{
TAILQ_REMOVE(&msgbuf->bufs, buf, entry);
/* TAILQ_REMOVE done by caller */
if (buf->fd != -1)
close(buf->fd);

View File

@ -299,11 +299,10 @@ int imsg_get_fd(struct imsgbuf *ibuf)
int fd;
struct imsg_fd *ifd;
if ((ifd = TAILQ_FIRST(&ibuf->fds)) == NULL)
if ((ifd = TAILQ_POP_FIRST(&ibuf->fds, entry)) == NULL)
return (-1);
fd = ifd->fd;
TAILQ_REMOVE(&ibuf->fds, ifd, entry);
free(ifd);
return (fd);

View File

@ -72,4 +72,17 @@
#include "freebsd-queue.h"
#endif /* defined(__OpenBSD__) && !defined(STAILQ_HEAD) */
#ifndef TAILQ_POP_FIRST
#define TAILQ_POP_FIRST(head, field) \
({ typeof((head)->tqh_first) _elm = TAILQ_FIRST(head); \
if (_elm) { \
if ((TAILQ_NEXT((_elm), field)) != NULL) \
TAILQ_NEXT((_elm), field)->field.tqe_prev = \
&TAILQ_FIRST(head); \
else \
(head)->tqh_last = &TAILQ_FIRST(head); \
TAILQ_FIRST(head) = TAILQ_NEXT((_elm), field); \
}; _elm; })
#endif
#endif /* _FRR_QUEUE_H */