aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2019-05-04 19:29:08 -0300
committerDavid Bremner <david@tethera.net>2019-05-05 08:01:17 -0300
commitae6b52488d71b879e2eb05d5ca6c4d4f641d0558 (patch)
treefe4979a87e0646b71c69298b93955b2b19d3df6a
parent35addc95aef546db8fee90a181518fedd50148cd (diff)
cli/show: avoid empty write to stdout in format_part_raw
Previously if the input was exactly a multiple of the internal buffer size, notmuch would attempt to fwrite nothing to stdout, but still expected fwrite to return 1, causing a failure that looked like this: $ notmuch show --format=raw id:87o96f1cya.fsf@codeaurora.org ...entire message shown as expected.. Error: Write failed $ echo $? 1 To fix the problem don't call fwrite at all when there's nothing to write. Amended by db: add some tests of message sizes likely to cause this problem.
-rw-r--r--notmuch-show.c2
-rwxr-xr-xtest/T210-raw.sh34
2 files changed, 35 insertions, 1 deletions
diff --git a/notmuch-show.c b/notmuch-show.c
index c3a3783a..98b85352 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -851,7 +851,7 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp),
return NOTMUCH_STATUS_FILE_ERROR;
}
- if (fwrite (buf, size, 1, stdout) != 1) {
+ if (size > 0 && fwrite (buf, size, 1, stdout) != 1) {
fprintf (stderr, "Error: Write failed\n");
fclose (file);
return NOTMUCH_STATUS_FILE_ERROR;
diff --git a/test/T210-raw.sh b/test/T210-raw.sh
index 99fdef72..85e707d4 100755
--- a/test/T210-raw.sh
+++ b/test/T210-raw.sh
@@ -30,4 +30,38 @@ Date: GENERATED_DATE
This is just a test message (#2)"
+test_python <<EOF
+from email.message import EmailMessage
+for pow in range(10,21):
+ size = 2 ** pow
+ msg = EmailMessage()
+ msg['Subject'] = 'message with {:07d} bytes'.format(size)
+ msg['From'] = 'Notmuch Test Suite <test_suite@notmuchmail.org>'
+ msg['To'] = msg['From']
+ msg['Message-Id'] = 'size-{:07d}@notmuch-test-suite'.format(size)
+ content = ""
+ msg.set_content("")
+ padding = size - len(bytes(msg))
+ lines = []
+ while padding > 0:
+ line = '.' * min(padding, 72)
+ lines.append(line)
+ padding = padding - len(line) - 1
+ content ='\n'.join(lines)
+ msg.set_content(content)
+ with open('mail/size-{:07d}'.format(size), 'wb') as f:
+ f.write(bytes(msg))
+EOF
+
+notmuch new --quiet
+
+for pow in {10..20}; do
+ printf -v size "%07d" $((2**$pow))
+ test_begin_subtest "content, message of size $size"
+ notmuch show --format=raw subject:$size > OUTPUT
+ test_expect_equal_file mail/size-$size OUTPUT
+ test_begin_subtest "return value, message of size $size"
+ test_expect_success "notmuch show --format=raw subject:$size > /dev/null"
+done
+
test_done