diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1997-08-25 15:24:08 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1997-08-25 15:24:08 +0000 |
commit | 73138c6a805b3d20f0625381b3f31c910da81d50 (patch) | |
tree | 793087e21c8573e02265711145d5f0f1feb0a2c8 | |
parent | 3390b24964033d1f57287f2efc41883bb8e9fd2b (diff) |
clear input buffer to ' ' or \0 correctly; jlemon@freebsd
-rw-r--r-- | bin/dd/dd.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/bin/dd/dd.c b/bin/dd/dd.c index 0f7267fa1cc..8a8380abddb 100644 --- a/bin/dd/dd.c +++ b/bin/dd/dd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dd.c,v 1.5 1997/02/14 07:05:20 millert Exp $ */ +/* $OpenBSD: dd.c,v 1.6 1997/08/25 15:24:07 deraadt Exp $ */ /* $NetBSD: dd.c,v 1.6 1996/02/20 19:29:06 jtc Exp $ */ /*- @@ -48,7 +48,7 @@ static char copyright[] = #if 0 static char sccsid[] = "@(#)dd.c 8.5 (Berkeley) 4/2/94"; #else -static char rcsid[] = "$OpenBSD: dd.c,v 1.5 1997/02/14 07:05:20 millert Exp $"; +static char rcsid[] = "$OpenBSD: dd.c,v 1.6 1997/08/25 15:24:07 deraadt Exp $"; #endif #endif /* not lint */ @@ -227,20 +227,18 @@ getfdtype(io) static void dd_in() { - int flags; ssize_t n; - for (flags = ddflags;;) { + for (;;) { if (cpy_cnt && (st.in_full + st.in_part) >= cpy_cnt) return; /* - * Zero the buffer first if trying to recover from errors so - * lose the minimum amount of data. If doing block operations + * Zero the buffer first if sync; if doing block operations * use spaces. */ - if ((flags & (C_NOERROR|C_SYNC)) == (C_NOERROR|C_SYNC)) - if (flags & (C_BLOCK|C_UNBLOCK)) + if (ddflags & C_SYNC) + if (ddflags & (C_BLOCK|C_UNBLOCK)) (void)memset(in.dbp, ' ', in.dbsz); else (void)memset(in.dbp, 0, in.dbsz); @@ -257,7 +255,7 @@ dd_in() * If noerror not specified, die. POSIX requires that * the warning message be followed by an I/O display. */ - if (!(flags & C_NOERROR)) + if (!(ddflags & C_NOERROR)) err(1, "%s", in.name); warn("%s", in.name); summary(); @@ -333,8 +331,11 @@ dd_close() block_close(); else if (cfunc == unblock) unblock_close(); - if (ddflags & C_OSYNC && out.dbcnt < out.dbsz) { - (void)memset(out.dbp, 0, out.dbsz - out.dbcnt); + if (ddflags & C_OSYNC && out.dbcnt && out.dbcnt < out.dbsz) { + if (ddflags & (C_BLOCK|C_UNBLOCK)) + memset(out.dbp, ' ', out.dbsz - out.dbcnt); + else + memset(out.dbp, 0, out.dbsz - out.dbcnt); out.dbcnt = out.dbsz; } if (out.dbcnt) |