From patchwork Wed Jul 10 18:25:03 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Zintakis X-Patchwork-Id: 258193 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 719372C041E for ; Thu, 11 Jul 2013 04:25:50 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754857Ab3GJSZt (ORCPT ); Wed, 10 Jul 2013 14:25:49 -0400 Received: from mail-la0-f46.google.com ([209.85.215.46]:61883 "EHLO mail-la0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753834Ab3GJSZs (ORCPT ); Wed, 10 Jul 2013 14:25:48 -0400 Received: by mail-la0-f46.google.com with SMTP id eg20so6086845lab.19 for ; Wed, 10 Jul 2013 11:25:47 -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=us+r7VxqqXxSx2AdoLgWWbZwanbofa8jCHqqWDP1NHI=; b=Tq6qOFqMxIm3rrjn0RB2UhrpYqNmLzXoKIcRUW8+CTpuO0HAMxWZd/kqWouq2OMdZn WwjD/EruHqZJIz/T/JeO1Hk6VReyN+w/UM1ik6S6IMV3Gct/zMFF+KDGoLsUSUv4Gpwm C33QDeVbKZI+9lweb4HW+GfLmgJ4KfCVqp3ZZ52HpLYrtoMcfg53eHNDIIfyC1hOH2Zk dboGV4XorvFurf+9ZIUuEew7PSJy4UZ3PnYcdhcYBxE9HHg/VEv09LFUR2TevqvezQVD kEtKeK6A9L9r3zeXwkuuOaeUVucNgYKW5mc9P1hMIuOk5CKj2ebaalV/wPoHF7Iu3vLv cLIQ== X-Received: by 10.152.44.225 with SMTP id h1mr15168334lam.90.1373480747138; Wed, 10 Jul 2013 11:25:47 -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.45 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 10 Jul 2013 11:25:46 -0700 (PDT) From: Michael Zintakis To: netfilter-devel@vger.kernel.org Cc: pablo@netfilter.org Subject: [PATCH v3 nfacct 5/29] bugfix: prevent 0-sized parameter being accepted Date: Wed, 10 Jul 2013 19:25:03 +0100 Message-Id: <1373480727-11254-6-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 * add nfacct_matches function to prevent zero-sized string being accepted as a command line parameter; Signed-off-by: Michael Zintakis --- src/nfacct.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/nfacct.c b/src/nfacct.c index 2ef93c3..1324da7 100644 --- a/src/nfacct.c +++ b/src/nfacct.c @@ -59,6 +59,21 @@ static void nfacct_perror(const char *msg) } } +/* Matches two strings, including partial matches */ +static int nfacct_matches(const char *cmd, const char *pattern) +{ + size_t len; + + if (cmd == NULL || pattern == NULL) + return 0; + + len = strlen(cmd); + if (len == 0 || len > strlen(pattern)) + return 0; + + return (strncmp(cmd, pattern, len) == 0); +} + int main(int argc, char *argv[]) { int cmd = NFACCT_CMD_NONE, ret = 0; @@ -68,21 +83,21 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - if (strncmp(argv[1], "list", strlen(argv[1])) == 0) + if (nfacct_matches(argv[1], "list")) cmd = NFACCT_CMD_LIST; - else if (strncmp(argv[1], "add", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "add")) cmd = NFACCT_CMD_ADD; - else if (strncmp(argv[1], "delete", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "delete")) cmd = NFACCT_CMD_DELETE; - else if (strncmp(argv[1], "get", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "get")) cmd = NFACCT_CMD_GET; - else if (strncmp(argv[1], "flush", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "flush")) cmd = NFACCT_CMD_FLUSH; - else if (strncmp(argv[1], "version", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "version")) cmd = NFACCT_CMD_VERSION; - else if (strncmp(argv[1], "help", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "help")) cmd = NFACCT_CMD_HELP; - else if (strncmp(argv[1], "restore", strlen(argv[1])) == 0) + else if (nfacct_matches(argv[1], "restore")) cmd = NFACCT_CMD_RESTORE; else { fprintf(stderr, "nfacct v%s: Unknown command: %s\n", @@ -167,9 +182,9 @@ static int nfacct_cmd_list(int argc, char *argv[]) int ret, i; for (i=2; i