mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-28 13:44:12 +01:00
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.
This commit is contained in:
parent
35addc95ae
commit
ae6b52488d
2 changed files with 35 additions and 1 deletions
|
@ -851,7 +851,7 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp),
|
||||||
return NOTMUCH_STATUS_FILE_ERROR;
|
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");
|
fprintf (stderr, "Error: Write failed\n");
|
||||||
fclose (file);
|
fclose (file);
|
||||||
return NOTMUCH_STATUS_FILE_ERROR;
|
return NOTMUCH_STATUS_FILE_ERROR;
|
||||||
|
|
|
@ -30,4 +30,38 @@ Date: GENERATED_DATE
|
||||||
|
|
||||||
This is just a test message (#2)"
|
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
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue