From e741e28ee8a89bd7637a972339486dabb500438b Mon Sep 17 00:00:00 2001 From: "/C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge@netfilter.org" Date: Sat, 6 Aug 2005 22:17:20 +0000 Subject: - add nfnl_fd() accessor function - export nfnl_check_attributes() - fix segfault (nfnlh->cb assignment missing) - memset() the nfattr array in nfnl_parse_attr() - fix endless loop in msg_next() --- include/libnfnetlink/libnfnetlink.h | 5 +++++ src/libnfnetlink.c | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/libnfnetlink/libnfnetlink.h b/include/libnfnetlink/libnfnetlink.h index d88c7fa..edd480d 100644 --- a/include/libnfnetlink/libnfnetlink.h +++ b/include/libnfnetlink/libnfnetlink.h @@ -35,6 +35,8 @@ struct nfnl_handle { struct nfnl_callback *cb; /* array of callbacks */ }; +extern int nfnl_fd(struct nfnl_handle *h); + /* get a new library handle */ extern int nfnl_open(struct nfnl_handle *, u_int8_t, u_int8_t, unsigned int); extern int nfnl_close(struct nfnl_handle *); @@ -69,6 +71,9 @@ extern int nfnl_handle_packet(struct nfnl_handle *, char *buf, int len); extern struct nfattr *nfnl_parse_hdr(const struct nfnl_handle *nfnlh, const struct nlmsghdr *nlh, struct nfgenmsg **genmsg); +extern int nfnl_check_attributes(const struct nfnl_handle *nfnlh, + const struct nlmsghdr *nlh, + struct nfattr *tb[]); extern struct nlmsghdr *nfnl_get_msg_first(struct nfnl_handle *h, const unsigned char *buf, size_t len); diff --git a/src/libnfnetlink.c b/src/libnfnetlink.c index 32eed10..58f3a0f 100644 --- a/src/libnfnetlink.c +++ b/src/libnfnetlink.c @@ -54,6 +54,11 @@ void nfnl_dump_packet(struct nlmsghdr *nlh, int received_len, char *desc) } } +int nfnl_fd(struct nfnl_handle *h) +{ + return h->fd; +} + /** * nfnl_open - open a netlink socket * @@ -107,6 +112,7 @@ int nfnl_open(struct nfnl_handle *nfnlh, u_int8_t subsys_id, nfnlh->seq = time(NULL); nfnlh->subsys_id = subsys_id; nfnlh->cb_count = cb_count; + nfnlh->cb = cb; return 0; } @@ -530,6 +536,8 @@ int nfnl_addattr32(struct nlmsghdr *n, int maxlen, int type, */ int nfnl_parse_attr(struct nfattr *tb[], int max, struct nfattr *nfa, int len) { + memset(tb, 0, sizeof(struct nfattr *) * max); + while (NFA_OK(nfa, len)) { if (nfa->nfa_type <= max) tb[nfa->nfa_type-1] = nfa; @@ -610,7 +618,7 @@ struct nlmsghdr *nfnl_get_msg_next(struct nfnl_handle *h, /* if last header in handle not inside this buffer, * drop reference to last header */ if (!h->last_nlhdr || - (unsigned char *)h->last_nlhdr > (buf + len) || + (unsigned char *)h->last_nlhdr >= (buf + len) || (unsigned char *)h->last_nlhdr < buf) { h->last_nlhdr = NULL; return NULL; @@ -654,8 +662,9 @@ int nfnl_callback_unregister(struct nfnl_handle *h, u_int8_t type) return 0; } -static int nfnl_check_attributes(struct nfnl_handle *h, struct nlmsghdr *nlh, - struct nfattr *nfa[]) +int nfnl_check_attributes(const struct nfnl_handle *h, + const struct nlmsghdr *nlh, + struct nfattr *nfa[]) { int min_len; u_int8_t type = NFNL_MSG_TYPE(nlh->nlmsg_type); -- cgit v1.2.3