--- src/create.c.orig 2011-09-26 11:26:52.000000000 -0700 +++ src/create.c 2011-09-26 12:01:27.000000000 -0700 @@ -1014,6 +1014,7 @@ off_t size_left = st->stat.st_size; off_t block_ordinal; union block *blk; + char *buffer; block_ordinal = current_block_ordinal (); blk = start_header (st); @@ -1029,7 +1030,7 @@ mv_begin_write (st->file_name, st->stat.st_size, st->stat.st_size); while (size_left > 0) { - size_t bufsize, count; + size_t bufsize, count, prevcount; blk = find_next_block (); @@ -1044,7 +1045,10 @@ memset (blk->buffer + size_left, 0, BLOCKSIZE - count); } - count = (fd <= 0) ? bufsize : safe_read (fd, blk->buffer, bufsize); +for(prevcount=0;;) +{ + buffer = blk->buffer + prevcount; + count = (fd <= 0) ? bufsize : safe_read (fd, buffer, bufsize - prevcount); if (count == SAFE_READ_ERROR) { read_diag_details (st->orig_file_name, @@ -1053,6 +1057,13 @@ return dump_status_short; } size_left -= count; + if (prevcount + count == bufsize || count == 0) + { + count += prevcount; + break; + } + prevcount += count; +} set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); if (count != bufsize)