From patchwork Wed Jul 10 18:25:01 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Zintakis X-Patchwork-Id: 258191 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id AE0582C048B for ; Thu, 11 Jul 2013 04:25:45 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754846Ab3GJSZo (ORCPT ); Wed, 10 Jul 2013 14:25:44 -0400 Received: from mail-la0-f47.google.com ([209.85.215.47]:65111 "EHLO mail-la0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753834Ab3GJSZn (ORCPT ); Wed, 10 Jul 2013 14:25:43 -0400 Received: by mail-la0-f47.google.com with SMTP id fe20so6070882lab.34 for ; Wed, 10 Jul 2013 11:25:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=g6WlyvDmGyEbwqe+p8/V5QUxOuDZARE2iYYseqZQAW4=; b=QxCxzPrhO80oXiN8Me958Kch6Bm0ovbT4uVnFjD3MNxZMZT5j/vxiTfa6DSHmcjkRQ 0jsXgTGiH6ZNY/7u2GwqzGs4l9WCUularlp3K/2PynP95df21Ps10s2KHUOdvEXsVyeY UV8pUIoggv+xFRDfyWv/x3QmWkNP20umnB6fU2ZVGF9xrRfsTxlIDehWe4+4su8BsMtA H12VFbC49hudWcfp2wrxh92fdLAAGIl/p59WF7d+U3z3k8vSte0FhY0Ye1s74Dx0aBai 8VT4RvUcS4C0FvUGaaiHvGC+TieshMI9172Mp6g3al8Pn4kL1OCHOPdsfr/zmxy5KFpI IPmw== X-Received: by 10.112.164.164 with SMTP id yr4mr15620442lbb.88.1373480742362; Wed, 10 Jul 2013 11:25:42 -0700 (PDT) Received: from xp1.wyse.network (assk.torservers.net. [78.108.63.46]) by mx.google.com with ESMTPSA id g7sm11472544lae.6.2013.07.10.11.25.39 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 10 Jul 2013 11:25:41 -0700 (PDT) From: Michael Zintakis To: netfilter-devel@vger.kernel.org Cc: pablo@netfilter.org Subject: [PATCH v3 libnetfilter_acct 3/29] bugfix: correct xml name parsing Date: Wed, 10 Jul 2013 19:25:01 +0100 Message-Id: <1373480727-11254-4-git-send-email-michael.zintakis@googlemail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1373480727-11254-1-git-send-email-michael.zintakis@googlemail.com> References: <1373480727-11254-1-git-send-email-michael.zintakis@googlemail.com> Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org * allow accounting object names to be properly encoded and displayed when xml output is needed, to fully conform to the xml specification. Signed-off-by: Michael Zintakis --- src/libnetfilter_acct.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/libnetfilter_acct.c b/src/libnetfilter_acct.c index ba89e2d..4d87da3 100644 --- a/src/libnetfilter_acct.c +++ b/src/libnetfilter_acct.c @@ -228,6 +228,43 @@ uint64_t nfacct_attr_get_u64(struct nfacct *nfacct, enum nfacct_attr_type type) } EXPORT_SYMBOL(nfacct_attr_get_u64); +static +void parse_nfacct_name_xml(char *buf, const char *name) +{ + static const char escape_chars[] = "\"'<>&"; + int length; + int n; + char e[10]; + const char *p; + + if (buf == NULL) + return; + + buf[0] = '\0'; + if (name == NULL) + return; + + length = strcspn(name, escape_chars); + if (length > 0 && name[length] == 0) { + /* no escaping required */ + strncat(buf, name, length); + } else { + for (p = strpbrk(name, escape_chars); p != NULL; + p = strpbrk(name, escape_chars)) { + if (p > name) + strncat(buf, name, p - name); + + n = *p; + snprintf(e, sizeof(e), "&#%d;", n); + strncat(buf, e, strlen(e)); + name = p + 1; + } + + /* strncat the rest */ + strncat(buf, name, length); + } +} + static int nfacct_snprintf_plain(char *buf, size_t rem, struct nfacct *nfacct, uint16_t flags) @@ -292,12 +329,16 @@ nfacct_snprintf_xml(char *buf, size_t rem, struct nfacct *nfacct, { int ret = 0; unsigned int size = 0, offset = 0; + char nfacct_name[NFACCT_NAME_MAX * 6 + 1]; + parse_nfacct_name_xml(nfacct_name, + nfacct_attr_get_str(nfacct, + NFACCT_ATTR_NAME)); ret = snprintf(buf, rem, "%s" "%.20"PRIu64"" "%.20"PRIu64"", - nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME), + nfacct_name, nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES), nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS)); BUFFER_SIZE(ret, size, rem, offset);