From patchwork Wed Jul 10 18:25:02 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Zintakis X-Patchwork-Id: 258192 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 DEB262C03DC for ; Thu, 11 Jul 2013 04:25:47 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754871Ab3GJSZq (ORCPT ); Wed, 10 Jul 2013 14:25:46 -0400 Received: from mail-lb0-f170.google.com ([209.85.217.170]:38848 "EHLO mail-lb0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753834Ab3GJSZq (ORCPT ); Wed, 10 Jul 2013 14:25:46 -0400 Received: by mail-lb0-f170.google.com with SMTP id t13so5909556lbd.29 for ; Wed, 10 Jul 2013 11:25:44 -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=br17wLoClzhAM9b/EFKxudtZTBE0CozfDho5ysUuOjs=; b=F8PW0dFtAdukhlbQNAiYkDDBcqYemq921wJsSKUc7ve5Yri2Z/L0y8bU514HdWOdwx Pds2icFqHcPTUtDYgYdr3m6PuYkrzue9zYXqeAxq0hVX+qATw6OjfFSSaYR/dnYJi1LS Vo6rmscB0ZjCwV9VQ/H+qG8XybwYJFcvuoi6wXLlI3JsVypjyypvEQpUhWQE30o+4psw 8V7/i1yFeihjoakda2qPIKg+dbMBtxK7xYMMyi2G7QqsgRzcuHejaXAjz9z+GA7p2Ses olj7h3Y02na743biXAGSBVcLZov9ztrzmlrmBd/4xbMPoFaCUW5mV3+TYzkraTbZwz2z 1P/w== X-Received: by 10.112.159.66 with SMTP id xa2mr15275567lbb.60.1373480744692; Wed, 10 Jul 2013 11:25:44 -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.42 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 10 Jul 2013 11:25:44 -0700 (PDT) From: Michael Zintakis To: netfilter-devel@vger.kernel.org Cc: pablo@netfilter.org Subject: [PATCH v3 libnetfilter_acct 4/29] bugfix: correct (plain) name parsing Date: Wed, 10 Jul 2013 19:25:02 +0100 Message-Id: <1373480727-11254-5-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 containing space or other "odd" characters to be properly parsed and displayed. Signed-off-by: Michael Zintakis --- include/libnetfilter_acct/libnetfilter_acct.h | 2 + src/libnetfilter_acct.c | 54 +++++++++++++++++++++++++-- src/libnetfilter_acct.map | 1 + 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/include/libnetfilter_acct/libnetfilter_acct.h b/include/libnetfilter_acct/libnetfilter_acct.h index b00e366..9f66c39 100644 --- a/include/libnetfilter_acct/libnetfilter_acct.h +++ b/include/libnetfilter_acct/libnetfilter_acct.h @@ -28,6 +28,8 @@ const void *nfacct_attr_get(struct nfacct *nfacct, enum nfacct_attr_type type); const char *nfacct_attr_get_str(struct nfacct *nfacct, enum nfacct_attr_type type); uint64_t nfacct_attr_get_u64(struct nfacct *nfacct, enum nfacct_attr_type type); +void parse_nfacct_name(char *buf, const char *name); + struct nlmsghdr; struct nlmsghdr *nfacct_nlmsg_build_hdr(char *buf, uint8_t cmd, uint16_t flags, uint32_t seq); diff --git a/src/libnetfilter_acct.c b/src/libnetfilter_acct.c index 4d87da3..493be3b 100644 --- a/src/libnetfilter_acct.c +++ b/src/libnetfilter_acct.c @@ -228,6 +228,52 @@ uint64_t nfacct_attr_get_u64(struct nfacct *nfacct, enum nfacct_attr_type type) } EXPORT_SYMBOL(nfacct_attr_get_u64); +void +parse_nfacct_name(char *buf, const char *name) +{ + static const char no_quote_chars[] = ",._-0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + static const char escape_chars[] = "\"\\'"; + size_t length; + const char *p; + + if (buf == NULL) + return; + + buf[0] = '\0'; + if (name == NULL) + return; + + length = strspn(name, no_quote_chars); + + if (length > 0 && name[length] == 0) { + /* no quoting required */ + strncat(buf, name, length); + } else { + /* there is at least one character in the name, which + we have to quote. Write double quotes around the + name and escape special characters with a backslash */ + strncat(buf,"\"",1); + + for (p = strpbrk(name, escape_chars); p != NULL; + p = strpbrk(name, escape_chars)) { + if (p > name) { + strncat(buf,name, p - name); + } + strncat(buf,"\\",1); + strncat(buf,p,1); + name = p + 1; + } + + /* strcat the rest and finish the double quoted + string */ + strncat(buf,name,strlen(name)); + strncat(buf,"\"",1); + } +} +EXPORT_SYMBOL(parse_nfacct_name); + static void parse_nfacct_name_xml(char *buf, const char *name) { @@ -270,16 +316,18 @@ nfacct_snprintf_plain(char *buf, size_t rem, struct nfacct *nfacct, uint16_t flags) { int ret; + char nfacct_name[NFACCT_NAME_MAX * 2 + 4]; + parse_nfacct_name(nfacct_name, + nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); if (flags & NFACCT_SNPRINTF_F_FULL) { ret = snprintf(buf, rem, "{ pkts = %.20"PRIu64", bytes = %.20"PRIu64" } = %s;", nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS), nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES), - nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); + nfacct_name); } else { - ret = snprintf(buf, rem, "%s\n", - nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME)); + ret = snprintf(buf, rem, "%s\n", nfacct_name); } return ret; diff --git a/src/libnetfilter_acct.map b/src/libnetfilter_acct.map index e71a6b3..f12bc8e 100644 --- a/src/libnetfilter_acct.map +++ b/src/libnetfilter_acct.map @@ -21,4 +21,5 @@ local: *; LIBNETFILTER_ACCT_1.1 { nfacct_snprintf; + parse_nfacct_name; } LIBNETFILTER_ACCT_1.0;