commit 00995639fe3b885494d7dfeda7af618ba018fdd1
Author:     Michael Forney <[email protected]>
AuthorDate: Sun Dec 4 00:32:21 2022 -0800
Commit:     Michael Forney <[email protected]>
CommitDate: Wed Apr 12 20:09:51 2023 -0700

    dd: Fix backwards comparison when handling short writes
    
    ipos is always ahead of opos, so the left side of this condition
    was never true. This only mattered when we get short writes, since
    on EOF we always have less than a full output block, so it takes
    only one normal write.

diff --git a/dd.c b/dd.c
index 6061048..350843b 100644
--- a/dd.c
+++ b/dd.c
@@ -221,7 +221,7 @@ main(int argc, char *argv[])
                        else
                                ofull++;
                        opos += ret;
-               } while ((eof && ipos < opos) || (!eof && ipos - opos >= obs));
+               } while (ipos - opos >= (eof ? 1 : obs));
                if (opos < ipos)
                        memmove(buf, buf + opos, ipos - opos);
                ipos -= opos;

Reply via email to