[PATCH] dd: Error out when unable to write entire read block
Denys Vlasenko
vda.linux at googlemail.com
Wed Jan 10 10:06:16 UTC 2018
Fixed, thanks!
On Wed, Jan 10, 2018 at 12:08 AM, Ari Sundholm <ari at tuxera.com> wrote:
> Busybox dd has a difference in behavior compared to coreutils dd
> in the case where the block count has been given and the last block
> can only partially be written (usually due to ENOSPC):
>
> $ dd if=/dev/zero of=foo bs=100M count=8; echo $?; rm foo
> dd: error writing 'foo': No space left on device
> 8+0 records in
> 7+0 records out
> 805220352 bytes (805 MB, 768 MiB) copied, 0.405782 s, 2.0 GB/s
> 1
> $ busybox dd if=/dev/zero of=foo bs=100M count=8; echo $?; rm foo
> 8+0 records in
> 7+1 records out
> 0
> $ df -h .
> Filesystem Size Used Avail Use% Mounted on
> tmpfs 768M 8.0K 768M 1% [redacted]
> $
>
> This breaks scripts which rely on busybox dd giving an exit value
> indicating failure when writing data fails.
>
> The solution is to error out when the block that was just read (be
> it full or partial) couldn't be written out in full, just as coreutils
> dd does.
>
> Signed-off-by: Ari Sundholm <ari at tuxera.com>
> ---
> coreutils/dd.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/coreutils/dd.c b/coreutils/dd.c
> index d302f35..0bce80c 100644
> --- a/coreutils/dd.c
> +++ b/coreutils/dd.c
> @@ -195,13 +195,15 @@ static bool write_and_stats(const void *buf, size_t len, size_t obs,
> ssize_t n = full_write_or_warn(buf, len, filename);
> if (n < 0)
> return 1;
> - if ((size_t)n == obs)
> - G.out_full++;
> - else if (n) /* > 0 */
> - G.out_part++;
> #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
> G.total_bytes += n;
> #endif
> + if ((size_t)n == obs)
> + G.out_full++;
> + else if ((size_t)n == len)
> + G.out_part++;
> + else /* if ((size_t)n != len) */
> + return 1;
> return 0;
> }
>
> --
> 2.7.4
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
More information about the busybox
mailing list