dd: Consider block count in inner read loop

When ibs is smaller than obs, checking the block count in the outer
loop is not sufficient; we need to break out of the inner read loop
once we've read the specified number of blocks.

Thanks to phoebos for reporting this issue.
This commit is contained in:
Michael Forney 2023-04-12 20:13:51 -07:00
parent 00995639fe
commit fb16e7c6ad
1 changed files with 5 additions and 1 deletions

6
dd.c
View File

@ -173,8 +173,12 @@ main(int argc, char *argv[])
eprintf("lseek:");
/* XXX: handle non-seekable files */
}
while (!eof && (count == -1 || ifull + ipart < count)) {
while (!eof) {
while (ipos - opos < obs) {
if (ifull + ipart == count) {
eof = 1;
break;
}
ret = read(ifd, buf + ipos, ibs);
if (ret == 0) {
eof = 1;