From 899706c44d6391ca0f0ea83609e507b986c88789 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 11 Jul 2010 14:01:20 +0200 Subject: nflog: consistent nflog_snprintf_xml() return value with snprintf() With this patch, nflog_snprintf_xml() returns the number of characters printed. If the output was truncated, then the return value is the number of characters that would have been written if enough space had been available. This makes nflog_snprintf_xml() consistent with the behaviour of snprintf(). Signed-off-by: Pablo Neira Ayuso --- src/libnetfilter_log.c | 123 +++++++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/libnetfilter_log.c b/src/libnetfilter_log.c index acc1edf..7ace0d6 100644 --- a/src/libnetfilter_log.c +++ b/src/libnetfilter_log.c @@ -482,24 +482,27 @@ int nflog_get_seq_global(struct nflog_data *nfad, u_int32_t *seq) return 0; } -#define SNPRINTF_FAILURE(size, len, offset) \ +#define SNPRINTF_FAILURE(ret, rem, offset, len) \ do { \ - if (size < 0 || (unsigned int) size >= len) \ - return size; \ - offset += size; \ - len -= size; \ + if (ret < 0) \ + return ret; \ + len += ret; \ + if (ret > rem) \ + ret = rem; \ + offset += ret; \ + rem -= ret; \ } while (0) -int nflog_snprintf_xml(char *buf, size_t len, struct nflog_data *tb, int flags) +int nflog_snprintf_xml(char *buf, size_t rem, struct nflog_data *tb, int flags) { struct nfulnl_msg_packet_hdr *ph; struct nfulnl_msg_packet_hw *hwph; u_int32_t mark, ifi; - int size, offset = 0, ret; + int size, offset = 0, len = 0, ret; char *data; - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); if (flags & NFLOG_XML_TIME) { time_t t; @@ -509,130 +512,130 @@ int nflog_snprintf_xml(char *buf, size_t len, struct nflog_data *tb, int flags) if (localtime_r(&t, &tm) == NULL) return -1; - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, + size = snprintf(buf + offset, rem, "%d", tm.tm_hour); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); size = snprintf(buf + offset, - len, "%02d", tm.tm_min); - SNPRINTF_FAILURE(size, len, offset); + rem, "%02d", tm.tm_min); + SNPRINTF_FAILURE(size, rem, offset, len); size = snprintf(buf + offset, - len, "%02d", tm.tm_sec); - SNPRINTF_FAILURE(size, len, offset); + rem, "%02d", tm.tm_sec); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, "%d", + size = snprintf(buf + offset, rem, "%d", tm.tm_wday + 1); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, "%d", tm.tm_mday); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, "%d", tm.tm_mday); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, "%d", + size = snprintf(buf + offset, rem, "%d", tm.tm_mon + 1); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, "%d", + size = snprintf(buf + offset, rem, "%d", 1900 + tm.tm_year); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); } data = nflog_get_prefix(tb); if (data && (flags & NFLOG_XML_PREFIX)) { - size = snprintf(buf + offset, len, "%s", data); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, "%s", data); + SNPRINTF_FAILURE(size, rem, offset, len); } ph = nflog_get_msg_packet_hdr(tb); if (ph) { - size = snprintf(buf + offset, len, "%u", ph->hook); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, "%u", ph->hook); + SNPRINTF_FAILURE(size, rem, offset, len); hwph = nflog_get_packet_hw(tb); if (hwph && (flags & NFLOG_XML_HW)) { int i, hlen = ntohs(hwph->hw_addrlen); - size = snprintf(buf + offset, len, "0x%04x" + size = snprintf(buf + offset, rem, "0x%04x" "", ntohs(ph->hw_protocol)); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); for (i=0; ihw_protocol)); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); } - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); } else if (flags & NFLOG_XML_HW) { - size = snprintf(buf + offset, len, "0x%04x" + size = snprintf(buf + offset, rem, "0x%04x" "", ntohs(ph->hw_protocol)); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); } } mark = nflog_get_nfmark(tb); if (mark && (flags & NFLOG_XML_MARK)) { - size = snprintf(buf + offset, len, "%u", mark); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, "%u", mark); + SNPRINTF_FAILURE(size, rem, offset, len); } ifi = nflog_get_indev(tb); if (ifi && (flags & NFLOG_XML_DEV)) { - size = snprintf(buf + offset, len, "%u", ifi); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, "%u", ifi); + SNPRINTF_FAILURE(size, rem, offset, len); } ifi = nflog_get_outdev(tb); if (ifi && (flags & NFLOG_XML_DEV)) { - size = snprintf(buf + offset, len, "%u", ifi); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, "%u", ifi); + SNPRINTF_FAILURE(size, rem, offset, len); } ifi = nflog_get_physindev(tb); if (ifi && (flags & NFLOG_XML_PHYSDEV)) { - size = snprintf(buf + offset, len, + size = snprintf(buf + offset, rem, "%u", ifi); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); } ifi = nflog_get_physoutdev(tb); if (ifi && (flags & NFLOG_XML_PHYSDEV)) { - size = snprintf(buf + offset, len, + size = snprintf(buf + offset, rem, "%u", ifi); - SNPRINTF_FAILURE(size, len, offset); + SNPRINTF_FAILURE(size, rem, offset, len); } ret = nflog_get_payload(tb, &data); if (ret >= 0 && (flags & NFLOG_XML_PAYLOAD)) { int i; - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); for (i=0; i"); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); } - size = snprintf(buf + offset, len, ""); - SNPRINTF_FAILURE(size, len, offset); + size = snprintf(buf + offset, rem, ""); + SNPRINTF_FAILURE(size, rem, offset, len); - return size; + return len; } -- cgit v1.2.3