<div dir="ltr"><div>It does the job, now opening the database with a relative path raise<br></div>a NotmuchError.<br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 8, 2015 at 8:02 AM, David Bremner <span dir="ltr"><<a href="mailto:david@tethera.net" target="_blank">david@tethera.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Morgan Veyret <<a href="mailto:morgan.veyret@gmail.com">morgan.veyret@gmail.com</a>> writes:<br>
<br>
><br>
> As I understand it's expected that the database path should be absolute but<br>
> corrupting the database when the path is relative sounds dangerous.<br>
<br>
</span>Thanks for the report.  I can see how this could happen, since the<br>
internal functions _notmuch_message_add_file_name and<br>
_notmuch_database_relative_path classify message filenames into absolute<br>
paths starting with the database path and paths relative to the database<br>
root.<br>
<br>
The obvious solution is to reject non-absolute paths in<br>
notmuch_database_open_verbose. A slightly friendlier approach would be<br>
to canonicalize the path, but this might have unforseen consequences for<br>
clients relying on the database path being exactly what they pass in.<br>
<br>
Can you see if the attached patch "fixes" it for you? You'll have to<br>
rebuild notmuch from source. The patch should apply to 0.20 or later.<br>
<br>
<br>diff --git a/lib/database.cc b/lib/database.cc<br>
index 78a24f7..2a5b82a 100644<br>
--- a/lib/database.cc<br>
+++ b/lib/database.cc<br>
@@ -847,6 +847,12 @@ notmuch_database_open_verbose (const char *path,<br>
        goto DONE;<br>
     }<br>
<br>
+    if (path[0] != '/') {<br>
+       message = strdup ("Error: Database path must be absolute.\n");<br>
+       status = NOTMUCH_STATUS_FILE_ERROR;<br>
+       goto DONE;<br>
+    }<br>
+<br>
     if (! (notmuch_path = talloc_asprintf (local, "%s/%s", path, ".notmuch"))) {<br>
        message = strdup ("Out of memory\n");<br>
        status = NOTMUCH_STATUS_OUT_OF_MEMORY;<br>
<br></blockquote></div><br></div>