diff options
Diffstat (limited to 'scp.c')
-rw-r--r-- | scp.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: scp.c,v 1.179 2013/11/20 20:53:10 deraadt Exp $ */ | 1 | /* $OpenBSD: scp.c,v 1.180 2014/06/24 02:21:01 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * scp - secure remote copy. This is basically patched BSD rcp which | 3 | * scp - secure remote copy. This is basically patched BSD rcp which |
4 | * uses ssh to do the data transfer (instead of using rcmd). | 4 | * uses ssh to do the data transfer (instead of using rcmd). |
@@ -755,7 +755,7 @@ source(int argc, char **argv) | |||
755 | static BUF buffer; | 755 | static BUF buffer; |
756 | BUF *bp; | 756 | BUF *bp; |
757 | off_t i, statbytes; | 757 | off_t i, statbytes; |
758 | size_t amt; | 758 | size_t amt, nr; |
759 | int fd = -1, haderr, indx; | 759 | int fd = -1, haderr, indx; |
760 | char *last, *name, buf[2048], encname[MAXPATHLEN]; | 760 | char *last, *name, buf[2048], encname[MAXPATHLEN]; |
761 | int len; | 761 | int len; |
@@ -828,12 +828,16 @@ next: if (fd != -1) { | |||
828 | if (i + (off_t)amt > stb.st_size) | 828 | if (i + (off_t)amt > stb.st_size) |
829 | amt = stb.st_size - i; | 829 | amt = stb.st_size - i; |
830 | if (!haderr) { | 830 | if (!haderr) { |
831 | if (atomicio(read, fd, bp->buf, amt) != amt) | 831 | if ((nr = atomicio(read, fd, |
832 | bp->buf, amt)) != amt) { | ||
832 | haderr = errno; | 833 | haderr = errno; |
834 | memset(bp->buf + nr, 0, amt - nr); | ||
835 | } | ||
833 | } | 836 | } |
834 | /* Keep writing after error to retain sync */ | 837 | /* Keep writing after error to retain sync */ |
835 | if (haderr) { | 838 | if (haderr) { |
836 | (void)atomicio(vwrite, remout, bp->buf, amt); | 839 | (void)atomicio(vwrite, remout, bp->buf, amt); |
840 | memset(bp->buf, 0, amt); | ||
837 | continue; | 841 | continue; |
838 | } | 842 | } |
839 | if (atomicio6(vwrite, remout, bp->buf, amt, scpio, | 843 | if (atomicio6(vwrite, remout, bp->buf, amt, scpio, |