summaryrefslogtreecommitdiff
path: root/scp.c
diff options
context:
space:
mode:
Diffstat (limited to 'scp.c')
-rw-r--r--scp.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/scp.c b/scp.c
index 0669d0215..a1b318b9f 100644
--- a/scp.c
+++ b/scp.c
@@ -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,