[Patch v2] notmuch-restore: handle empty input file, leading blank lines and comments.
[notmuch-archives.git] / 3c / a9696af13b95b0c97164060127abc99896fec4
1 Return-Path: <bremner@tethera.net>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5         by olra.theworths.org (Postfix) with ESMTP id 95160431FAF\r
6         for <notmuch@notmuchmail.org>; Sun,  6 Jan 2013 06:05:23 -0800 (PST)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: 0\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
12         autolearn=disabled\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id xUF+PCnxewCZ for <notmuch@notmuchmail.org>;\r
16         Sun,  6 Jan 2013 06:05:23 -0800 (PST)\r
17 Received: from tesseract.cs.unb.ca (tesseract.cs.unb.ca [131.202.240.238])\r
18         (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits))\r
19         (No client certificate requested)\r
20         by olra.theworths.org (Postfix) with ESMTPS id EDC70431FAE\r
21         for <notmuch@notmuchmail.org>; Sun,  6 Jan 2013 06:05:22 -0800 (PST)\r
22 Received: from fctnnbsc30w-156034082078.dhcp-dynamic.fibreop.nb.bellaliant.net\r
23         ([156.34.82.78] helo=zancas.localnet)\r
24         by tesseract.cs.unb.ca with esmtpsa\r
25         (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80)\r
26         (envelope-from <bremner@tethera.net>)\r
27         id 1Trqql-0005X8-4a; Sun, 06 Jan 2013 10:05:19 -0400\r
28 Received: from bremner by zancas.localnet with local (Exim 4.80)\r
29         (envelope-from <bremner@tethera.net>)\r
30         id 1Trqqf-00088k-Gt; Sun, 06 Jan 2013 10:05:13 -0400\r
31 From: david@tethera.net\r
32 To: notmuch@notmuchmail.org\r
33 Subject: [Patch v2] notmuch-restore: handle empty input file,\r
34         leading blank lines and comments.\r
35 Date: Sun,  6 Jan 2013 10:04:56 -0400\r
36 Message-Id: <1357481096-31254-1-git-send-email-david@tethera.net>\r
37 X-Mailer: git-send-email 1.7.10.4\r
38 In-Reply-To: <m2wqvri8k3.fsf@guru.guru-group.fi>\r
39 References: <m2wqvri8k3.fsf@guru.guru-group.fi>\r
40 X-Spam_bar: -\r
41 Cc: David Bremner <bremner@debian.org>\r
42 X-BeenThere: notmuch@notmuchmail.org\r
43 X-Mailman-Version: 2.1.13\r
44 Precedence: list\r
45 List-Id: "Use and development of the notmuch mail system."\r
46         <notmuch.notmuchmail.org>\r
47 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
48         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
49 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
50 List-Post: <mailto:notmuch@notmuchmail.org>\r
51 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
52 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
53         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
54 X-List-Received-Date: Sun, 06 Jan 2013 14:05:23 -0000\r
55 \r
56 From: David Bremner <bremner@debian.org>\r
57 \r
58 This patch corrects several undesirable behaviours:\r
59 \r
60 1) Empty files were not detected, leading to buffer read overrun.\r
61 \r
62 2) An initial blank line cause restore to silently abort\r
63 \r
64 3) Initial comment line caused format detection to fail\r
65 ---\r
66  notmuch-restore.c |   18 +++++++++++++-----\r
67  test/dump-restore |    3 ---\r
68  2 files changed, 13 insertions(+), 8 deletions(-)\r
69 \r
70 diff --git a/notmuch-restore.c b/notmuch-restore.c\r
71 index d43546d..f436989 100644\r
72 --- a/notmuch-restore.c\r
73 +++ b/notmuch-restore.c\r
74 @@ -181,11 +181,6 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])\r
75                  argv[opt_index]);\r
76         return 1;\r
77      }\r
78 -    char *p;\r
79 -\r
80 -    line_len = getline (&line, &line_size, input);\r
81 -    if (line_len == 0)\r
82 -       return 0;\r
83  \r
84      tag_ops = tag_op_list_create (ctx);\r
85      if (tag_ops == NULL) {\r
86 @@ -193,6 +188,19 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])\r
87         return 1;\r
88      }\r
89  \r
90 +    do {\r
91 +       line_len = getline (&line, &line_size, input);\r
92 +\r
93 +       /* empty input file not considered an error */\r
94 +       if (line_len < 0)\r
95 +           return 0;\r
96 +\r
97 +    } while ((line_len == 0) ||\r
98 +            (line[0] == '#') ||\r
99 +            /* the cast is safe because we checked about for line_len < 0 */\r
100 +            (strspn (line, " \t\n") == (unsigned)line_len));\r
101 +\r
102 +    char *p;\r
103      for (p = line; (input_format == DUMP_FORMAT_AUTO) && *p; p++) {\r
104         if (*p == '(')\r
105             input_format = DUMP_FORMAT_SUP;\r
106 diff --git a/test/dump-restore b/test/dump-restore\r
107 index c2ddb92..ae30cd1 100755\r
108 --- a/test/dump-restore\r
109 +++ b/test/dump-restore\r
110 @@ -146,13 +146,11 @@ cat <<EOF > comments-and-blanks\r
111  EOF\r
112  \r
113  test_begin_subtest 'restoring empty file is not an error'\r
114 -test_subtest_known_broken\r
115  notmuch restore < /dev/null 2>OUTPUT.$test_count\r
116  cp /dev/null EXPECTED\r
117  test_expect_equal_file EXPECTED OUTPUT.$test_count\r
118  \r
119  test_begin_subtest 'file of comments and blank lines is not an error'\r
120 -test_subtest_known_broken\r
121  notmuch restore --input=comments-and-blanks\r
122  ret_val=$?\r
123  test_expect_equal "$ret_val" "0"\r
124 @@ -172,7 +170,6 @@ echo "yun1vjwegii.fsf@aiko.keithp.com (another_tag)" \\r
125      >> leading-comments-blanks-sup\r
126  \r
127  test_begin_subtest 'detect format=sup with leading comments and blanks'\r
128 -test_subtest_known_broken\r
129  notmuch restore --input=leading-comments-blanks-sup\r
130  notmuch search --output=tags id:yun1vjwegii.fsf@aiko.keithp.com > OUTPUT.$test_count\r
131  echo "another_tag" > EXPECTED\r
132 -- \r
133 1.7.10.4\r
134 \r