mirror of
https://git.notmuchmail.org/git/notmuch
synced 2025-01-03 07:11:41 +01:00
lib: convert relative filenames to absolute in n_d_index_file
The API docs promise to handle relative filenames, but the code did not do it. Also check for files outside the mail root, as implied by the API description. This fixes the bug reported at id:87sgdqo0rz.fsf@tethera.net
This commit is contained in:
parent
be3f4aec3f
commit
c477d7ce31
2 changed files with 37 additions and 5 deletions
|
@ -64,19 +64,35 @@ _notmuch_message_file_open_ctx (notmuch_database_t *notmuch,
|
|||
if (unlikely (message == NULL))
|
||||
return NULL;
|
||||
|
||||
const char *prefix = notmuch_database_get_path (notmuch);
|
||||
if (prefix == NULL)
|
||||
goto FAIL;
|
||||
|
||||
if (*filename == '/') {
|
||||
if (strncmp (filename, prefix, strlen(prefix)) != 0) {
|
||||
_notmuch_database_log (notmuch, "Error opening %s: path outside mail root\n",
|
||||
filename);
|
||||
errno = 0;
|
||||
goto FAIL;
|
||||
}
|
||||
message->filename = talloc_strdup (message, filename);
|
||||
} else {
|
||||
message->filename = talloc_asprintf(message, "%s/%s", prefix, filename);
|
||||
}
|
||||
|
||||
if (message->filename == NULL)
|
||||
goto FAIL;
|
||||
|
||||
talloc_set_destructor (message, _notmuch_message_file_destructor);
|
||||
|
||||
message->stream = g_mime_stream_gzfile_open (filename);
|
||||
message->stream = g_mime_stream_gzfile_open (message->filename);
|
||||
if (message->stream == NULL)
|
||||
goto FAIL;
|
||||
|
||||
return message;
|
||||
|
||||
FAIL:
|
||||
if (errno)
|
||||
_notmuch_database_log (notmuch, "Error opening %s: %s\n",
|
||||
filename, strerror (errno));
|
||||
_notmuch_message_file_close (message);
|
||||
|
|
|
@ -258,7 +258,6 @@ test_expect_equal_file EXPECTED OUTPUT
|
|||
|
||||
generate_message '[filename]=relative_path'
|
||||
test_begin_subtest "index file (relative path)"
|
||||
test_subtest_known_broken
|
||||
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
|
||||
{
|
||||
notmuch_message_t *msg;
|
||||
|
@ -273,4 +272,21 @@ cat <<EOF > EXPECTED
|
|||
EOF
|
||||
test_expect_equal_file EXPECTED OUTPUT
|
||||
|
||||
test_begin_subtest "index file (absolute path outside mail root)"
|
||||
cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR}
|
||||
{
|
||||
notmuch_message_t *msg;
|
||||
stat = notmuch_database_index_file (db, "/dev/zero", NULL, &msg);
|
||||
printf ("%d\n", stat == NOTMUCH_STATUS_FILE_ERROR);
|
||||
}
|
||||
EOF
|
||||
cat <<EOF > EXPECTED
|
||||
== stdout ==
|
||||
1
|
||||
== stderr ==
|
||||
Error opening /dev/zero: path outside mail root
|
||||
EOF
|
||||
test_expect_equal_file EXPECTED OUTPUT
|
||||
|
||||
|
||||
test_done
|
||||
|
|
Loading…
Reference in a new issue