notmuch-restore: handle empty input file, leading blank lines and comments.

This patch corrects several undesirable behaviours:

1) Empty files were not detected, leading to buffer read overrun.

2) An initial blank line cause restore to silently abort

3) Initial comment line caused format detection to fail
This commit is contained in:
David Bremner 2012-12-26 15:36:33 -04:00
parent 4dea9bb442
commit d705a6a45b
2 changed files with 13 additions and 8 deletions

View file

@ -181,11 +181,6 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
argv[opt_index]);
return 1;
}
char *p;
line_len = getline (&line, &line_size, input);
if (line_len == 0)
return 0;
tag_ops = tag_op_list_create (ctx);
if (tag_ops == NULL) {
@ -193,6 +188,19 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
return 1;
}
do {
line_len = getline (&line, &line_size, input);
/* empty input file not considered an error */
if (line_len < 0)
return 0;
} while ((line_len == 0) ||
(line[0] == '#') ||
/* the cast is safe because we checked about for line_len < 0 */
(strspn (line, " \t\n") == (unsigned)line_len));
char *p;
for (p = line; (input_format == DUMP_FORMAT_AUTO) && *p; p++) {
if (*p == '(')
input_format = DUMP_FORMAT_SUP;

View file

@ -146,13 +146,11 @@ cat <<EOF > comments-and-blanks
EOF
test_begin_subtest 'restoring empty file is not an error'
test_subtest_known_broken
notmuch restore < /dev/null 2>OUTPUT.$test_count
cp /dev/null EXPECTED
test_expect_equal_file EXPECTED OUTPUT.$test_count
test_begin_subtest 'file of comments and blank lines is not an error'
test_subtest_known_broken
notmuch restore --input=comments-and-blanks
ret_val=$?
test_expect_equal "$ret_val" "0"
@ -172,7 +170,6 @@ echo "yun1vjwegii.fsf@aiko.keithp.com (another_tag)" \
>> leading-comments-blanks-sup
test_begin_subtest 'detect format=sup with leading comments and blanks'
test_subtest_known_broken
notmuch restore --input=leading-comments-blanks-sup
notmuch search --output=tags id:yun1vjwegii.fsf@aiko.keithp.com > OUTPUT.$test_count
echo "another_tag" > EXPECTED