[PATCH 2/3] lib: fix handling of one character long directory names at top level
authorJani Nikula <jani@nikula.org>
Sun, 10 Apr 2016 19:43:22 +0000 (22:43 +0300)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:21:35 +0000 (16:21 -0700)
2e/0238e609a9bb8defa8ddd587214fdd823ed9b4 [new file with mode: 0644]

diff --git a/2e/0238e609a9bb8defa8ddd587214fdd823ed9b4 b/2e/0238e609a9bb8defa8ddd587214fdd823ed9b4
new file mode 100644 (file)
index 0000000..b9e798a
--- /dev/null
@@ -0,0 +1,150 @@
+Return-Path: <jani@nikula.org>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 79A806DE0008\r
+ for <notmuch@notmuchmail.org>; Sun, 10 Apr 2016 12:44:48 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.558\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.558 tagged_above=-999 required=5 tests=[AWL=0.162,\r
+  DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_LOW=-0.7,\r
+ RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01] autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id nfu7wjkc7SG1 for <notmuch@notmuchmail.org>;\r
+ Sun, 10 Apr 2016 12:44:40 -0700 (PDT)\r
+Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com\r
+ [74.125.82.66]) by arlo.cworth.org (Postfix) with ESMTPS id 427156DE028C for\r
+ <notmuch@notmuchmail.org>; Sun, 10 Apr 2016 12:44:40 -0700 (PDT)\r
+Received: by mail-wm0-f66.google.com with SMTP id n3so16822443wmn.1\r
+ for <notmuch@notmuchmail.org>; Sun, 10 Apr 2016 12:44:40 -0700 (PDT)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+ d=nikula-org.20150623.gappssmtp.com; s=20150623;\r
+ h=from:to:cc:subject:date:message-id:in-reply-to:references;\r
+ bh=JyHaoTek1t3VbWiG4zUshy1t8BT/SLk37xZ1+bmvAqs=;\r
+ b=m7pApQwS3msxZIQGqIAUDfUJ/5jNHKGscj71SZke6stmbvvQtD1GfBFrHaZ/frYyv0\r
+ xbYsef75gDTEd7IqeoNidHR8I7ghxCZDyZ0sSnRDR/rk3utaybJ7UtZKcifJa/cGldFg\r
+ MMt9osFZ534keakij//bbQZ/G0RJuTXYKYHPsoX2+KhEUJwXLTiZvSBrVRlN2inhGt+e\r
+ Kg54o+EEXJkCMInmU7iOdc0W69DY4uxXMl3XFQK1X5z6aM9uvNu944Ru7Nh1GkkHUghy\r
+ moUGdwAg3ibLrXwzU1xW3Fq5e46pktwtouqM13aN+qL6pN/PF4IzwYqb907CRjLFzRDU\r
+ 8A2w==\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+ d=1e100.net; s=20130820;\r
+ h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\r
+ :references;\r
+ bh=JyHaoTek1t3VbWiG4zUshy1t8BT/SLk37xZ1+bmvAqs=;\r
+ b=lh0LzcHVho/8kjJSxPimgilGQgRLf8LDZZu1oYE0xPEguiDPwI7fCHYM816ukkdFjU\r
+ CDW7yiPwY0gefaierS/J7utSAccBlyZWR/pfvFIJOqXznYOzaUfPyEq3seclrgV7BSm2\r
+ Zqf11BzEPOA7vhW6nTAG64uNGjSuw1aYx7AB/Ldu8dr8gHx7plG5G2X2G+e9Vx8yStlY\r
+ iMbnmv0SJ0snaloq6B8fssx/BUj4HeI5ehnZWLvPwiVugQpL/T6k16gOL8FFVgTKMQik\r
+ CqTgvLK6K3Kol4KTu5GZcFakS9mrGJsIn8DZQIc5EjJLuY+jmsn3u2G0bnTJcTch2PbL\r
+ Pjbw==\r
+X-Gm-Message-State:\r
+ AD7BkJK8MZp0W8W6QEBoxQTqAHFGxcPEiijqiK9tUmBQZc7k+WDkIQ8U7XqvGHzrCgqCzg==\r
+X-Received: by 10.28.176.133 with SMTP id z127mr14940871wme.66.1460317479006; \r
+ Sun, 10 Apr 2016 12:44:39 -0700 (PDT)\r
+Received: from localhost (mobile-access-bcee7f-102.dhcp.inet.fi.\r
+ [188.238.127.102])\r
+ by smtp.gmail.com with ESMTPSA id m134sm13720530wmd.14.2016.04.10.12.44.38\r
+ (version=TLSv1/SSLv3 cipher=OTHER);\r
+ Sun, 10 Apr 2016 12:44:38 -0700 (PDT)\r
+From: Jani Nikula <jani@nikula.org>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 2/3] lib: fix handling of one character long directory names\r
+ at top level\r
+Date: Sun, 10 Apr 2016 22:43:22 +0300\r
+Message-Id: <1460317403-13714-2-git-send-email-jani@nikula.org>\r
+X-Mailer: git-send-email 2.1.4\r
+In-Reply-To: <1460317403-13714-1-git-send-email-jani@nikula.org>\r
+References: <1460317403-13714-1-git-send-email-jani@nikula.org>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sun, 10 Apr 2016 19:44:48 -0000\r
+\r
+The code to skip multiple slashes in _notmuch_database_split_path()\r
+skips back one character too much. This is compensated by a +1 in the\r
+length parameter to the strndup() call. Mostly this works fine, but if\r
+the path is to a file under a top level directory with one character\r
+long name, the directory part is mistaken to be part of the file name\r
+(slash == path in code). The returned directory name will be the empty\r
+string and the basename will be the full path, breaking the indexing\r
+logic in notmuch new.\r
+\r
+Fix the multiple slash skipping to keep the slash variable pointing at\r
+the last slash, and adjust strndup() accordingly.\r
+\r
+The bug was introduced in\r
+\r
+commit e890b0cf4011fd9fd77ebd87343379e4a778888b\r
+Author: Carl Worth <cworth@cworth.org>\r
+Date:   Sat Dec 19 13:20:26 2009 -0800\r
+\r
+    database: Store the parent ID for each directory document.\r
+\r
+just a little over two months after the initial commit in the Notmuch\r
+code history, making this the longest living bug in Notmuch to date.\r
+---\r
+ lib/database.cc  | 4 ++--\r
+ test/T050-new.sh | 5 -----\r
+ 2 files changed, 2 insertions(+), 7 deletions(-)\r
+\r
+diff --git a/lib/database.cc b/lib/database.cc\r
+index 3b342f136a53..b8486f7d5271 100644\r
+--- a/lib/database.cc\r
++++ b/lib/database.cc\r
+@@ -1781,7 +1781,7 @@ _notmuch_database_split_path (void *ctx,\r
\r
+     /* Finally, skip multiple slashes. */\r
+     while (slash != path) {\r
+-      if (*slash != '/')\r
++      if (*(slash - 1) != '/')\r
+           break;\r
\r
+       --slash;\r
+@@ -1794,7 +1794,7 @@ _notmuch_database_split_path (void *ctx,\r
+           *basename = path;\r
+     } else {\r
+       if (directory)\r
+-          *directory = talloc_strndup (ctx, path, slash - path + 1);\r
++          *directory = talloc_strndup (ctx, path, slash - path);\r
+     }\r
\r
+     return NOTMUCH_STATUS_SUCCESS;\r
+diff --git a/test/T050-new.sh b/test/T050-new.sh\r
+index 174715aa2781..53e02d22c383 100755\r
+--- a/test/T050-new.sh\r
++++ b/test/T050-new.sh\r
+@@ -170,7 +170,6 @@ test_expect_equal "$output" "(D) add_files, pass 3: queuing leftover directory $\r
+ No new mail. Removed 3 messages."\r
\r
+ test_begin_subtest "One character directory at top level"\r
+-test_subtest_known_broken\r
\r
+ generate_message [dir]=A\r
+ generate_message [dir]=A/B\r
+@@ -179,10 +178,6 @@ generate_message [dir]=A/B/C\r
+ output=$(NOTMUCH_NEW --debug)\r
+ test_expect_equal "$output" "Added 3 new messages to the database."\r
\r
+-# clean up after the broken test to not mess up other tests\r
+-rm -rf "${MAIL_DIR}"/A\r
+-NOTMUCH_NEW 2>&1 > /dev/null\r
+-\r
+ test_begin_subtest "Support single-message mbox"\r
+ cat > "${MAIL_DIR}"/mbox_file1 <<EOF\r
+ From test_suite@notmuchmail.org Fri Jan  5 15:43:57 2001\r
+-- \r
+2.1.4\r
+\r