From patchwork Tue Sep 17 13:13:23 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Smith X-Patchwork-Id: 275453 X-Patchwork-Delegate: kadlec@blackhole.kfki.hu 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 7704C2C00CC for ; Tue, 17 Sep 2013 23:15:13 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752759Ab3IQNPL (ORCPT ); Tue, 17 Sep 2013 09:15:11 -0400 Received: from mail.uptheinter.net ([77.74.196.236]:60539 "EHLO mail.uptheinter.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752683Ab3IQNPK (ORCPT ); Tue, 17 Sep 2013 09:15:10 -0400 Received: from localhost (localhost [127.0.0.1]) by mail.uptheinter.net (Postfix) with ESMTP id 065A5A32BB for ; Tue, 17 Sep 2013 14:15:10 +0100 (BST) X-DKIM: Sendmail DKIM Filter v2.7.2 mail.uptheinter.net 065A5A32BB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa; s=default; t=1379423710; bh=H9Z kNsjmWU2taWKxX5Yt76678pFxXY/YQV6S3T8xAI0=; h=From:To:Subject:Date: Message-Id:In-Reply-To:References; b=kKvtXWMjTLTwNpD8sV3TmUsmGZaLj JHpJqVmeZITzrICqPUXiezdEgX4VS8DYL9VT+9ZSXJc5mcgiKUiH265fRd6DskOnlxE R1c4UATzi6Qz7wg01jyyupccth+RcofG1mQgyHH3057COUj/1bFFlJONE6Vm4zyk7Nz WOaisYdU= X-Virus-Scanned: amavisd-new at Received: from mail.uptheinter.net ([127.0.0.1]) by localhost (vps2.uptheinter.net [127.0.0.1]) (amavisd-new, port 10024) with LMTP id cIZdNarlFL_C for ; Tue, 17 Sep 2013 14:14:46 +0100 (BST) From: Oliver To: netfilter-devel@vger.kernel.org Subject: [PATCH 4/6] ipset: Rework the "fake" argument parsing for ipset restore. Date: Tue, 17 Sep 2013 15:13:23 +0200 Message-Id: <1379423605-22777-5-git-send-email-oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1379423605-22777-1-git-send-email-oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa> References: <1379423605-22777-1-git-send-email-oliver@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa> Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org From: Oliver Smith This reworks the argument parsing functionality of ipset to handle quote-delimited lines in such a way that they are considered to be a single argument. This commit is necessary for ipset to successfully restore sets that have comments. Signed-off-by: Oliver Smith --- src/ipset.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/ipset.c b/src/ipset.c index 4f308da..d9d609c 100644 --- a/src/ipset.c +++ b/src/ipset.c @@ -159,20 +159,44 @@ ipset_print_file(const char *fmt, ...) static void build_argv(char *buffer) { - char *ptr; + char *ptr, *tmp; int i; /* Reset */ - for (i = 1; i < newargc; i++) + for (i = 1; i < newargc; i++) { + if(newargv[i]) + free(newargv[i]); newargv[i] = NULL; + } newargc = 1; ptr = strtok(buffer, " \t\r\n"); - newargv[newargc++] = ptr; + newargv[newargc] = calloc(strlen(ptr) + 1, sizeof(*ptr)); + ipset_strlcpy(newargv[newargc++], ptr, strlen(ptr) + 1); while ((ptr = strtok(NULL, " \t\r\n")) != NULL) { - if ((newargc + 1) < (int)(sizeof(newargv)/sizeof(char *))) - newargv[newargc++] = ptr; - else { + if ((newargc + 1) < (int)(sizeof(newargv)/sizeof(char *))) { + tmp = newargv[newargc] = calloc(strlen(ptr) + 1, + sizeof(*ptr)); + if(*ptr == '"') { + ipset_strlcpy(tmp, ptr + 1, (strlen(ptr) + 1) * + sizeof(*ptr)); + ipset_strlcat(tmp, " ", (strlen(ptr) + 1) * + sizeof(*ptr)); + while((ptr = strtok(NULL, "\"")) != NULL) { + if(*ptr == '\n' || *ptr == '\r') + continue; + tmp = realloc(tmp, (strlen(tmp) + + strlen(ptr) + 1) * + sizeof(*ptr)); + ipset_strlcat(tmp, ptr, (strlen(tmp) + + strlen(ptr) + 1) * + sizeof(*ptr)); + } + } else + ipset_strlcpy(tmp, ptr, (strlen(ptr) + 1) * + sizeof(*ptr)); + newargv[newargc++] = tmp; + } else { exit_error(PARAMETER_PROBLEM, "Line is too long to parse."); return; @@ -195,7 +219,8 @@ restore(char *argv0) /* Initialize newargv/newargc */ newargc = 0; - newargv[newargc++] = argv0; + newargv[newargc] = calloc(strlen(argv0) + 1, sizeof(*argv0)); + ipset_strlcpy(newargv[newargc++], argv0, strlen(argv0) + 1); if (filename) { fd = fopen(filename, "r"); if (!fd) { @@ -232,6 +257,7 @@ restore(char *argv0) if (ret < 0) handle_error(); + free(newargv[0]); return ret; }