X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tfc_skein.c;h=6c595e1bcd206339a44ad9c84682853ce642ac65;hb=6a181d607fe6fe8c66b894efb281855bb2eee573;hp=369fc234bf2fe06e0335e032faa6e3a02822aa1e;hpb=efa545d64b910923248233618e774ca3b87efebb;p=tfcrypt.git diff --git a/tfc_skein.c b/tfc_skein.c index 369fc23..6c595e1 100644 --- a/tfc_skein.c +++ b/tfc_skein.c @@ -77,6 +77,7 @@ tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize re pblk = skblk; lblock = lrem = blk_len_adj(readto, total, TFC_BLKSIZE); ldone = 0; + if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(fd); _again: lio = read(fd, pblk, lrem); if (lio == 0) stop = YES; if (lio != NOSIZE) ldone += lio; @@ -85,11 +86,13 @@ _again: lio = read(fd, pblk, lrem); switch (error_action) { case TFC_ERRACT_CONT: xerror(YES, NO, NO, "skeinfd: %d", fd); goto _again; break; case TFC_ERRACT_SYNC: + case TFC_ERRACT_LSYNC: xerror(YES, NO, NO, "skeinfd: %d", fd); lio = lrem = ldone = lblock; total += lio; memset(skblk, 0, lio); - lseek(fd, lio, SEEK_CUR); + if (rdpos == NOFSIZE) lseek(fd, lio, SEEK_CUR); + else lseek(fd, rdpos + lio, SEEK_SET); break; default: goto _fail; break; }