tfc_io: xread and xwrite, which transparently handle EINTR case.
authorAndrey Rys <rys@lynxlynx.ru>
Sat, 26 Jan 2019 12:32:41 +0000 (19:32 +0700)
committerAndrey Rys <rys@lynxlynx.ru>
Sat, 26 Jan 2019 12:32:41 +0000 (19:32 +0700)
VERSION
tfc_base64.c
tfc_io.c [new file with mode: 0644]
tfc_random.c
tfc_skein.c
tfcrypt.c
tfcrypt.h

diff --git a/VERSION b/VERSION
index 1e8b314962144c26d5e0e50fd29d2ca327864913..7f8f011eb73d6043d2e6db9d2c101195ae2801f2 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-6
+7
index 2498004d7211e13c164f9839022b0f8686b9815e..f1d68f670e9d5c380e210a5446ab79aeeecc3cc2 100644 (file)
@@ -69,7 +69,7 @@ void do_edbase64(char **fargv)
                lblock = lrem = do_edcrypt == TFC_DO_DECRYPT ? TFC_B64_DWIDTH : TFC_B64_EWIDTH;
                ldone = 0;
                if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_again:                lio = read(sfd, pblk, lrem);
+_again:                lio = xread(sfd, pblk, lrem);
                if (lio == 0) do_stop = YES;
                if (lio != NOSIZE) ldone += lio;
                else {
@@ -113,13 +113,13 @@ _again:           lio = read(sfd, pblk, lrem);
                }
                lrem = ldone;
                ldone = 0;
-_wagain:       lio = write(dfd, pblk, lrem);
+_wagain:       lio = xwrite(dfd, pblk, lrem);
                if (lio != NOSIZE) ldone += lio;
                else xerror(NO, NO, NO, "%s", fargv[1]);
                if (do_edcrypt == TFC_DO_ENCRYPT) {
                        size_t t;
                        if (lread >= lblock || do_stop == TFC_STOP_FULL) {
-                               t = write(dfd, "\n", 1);
+                               t = xwrite(dfd, "\n", 1);
                                if (t != NOSIZE) lio += t;
                                else lio = NOSIZE;
                        }
diff --git a/tfc_io.c b/tfc_io.c
new file mode 100644 (file)
index 0000000..2d3fd30
--- /dev/null
+++ b/tfc_io.c
@@ -0,0 +1,23 @@
+#include "tfcrypt.h"
+
+size_t xread(int fd, void *data, size_t szdata)
+{
+       size_t x;
+
+       do {
+               x = (size_t)read(fd, data, szdata);
+       } while (x == NOSIZE && errno == EINTR);
+
+       return x;
+}
+
+size_t xwrite(int fd, const void *data, size_t szdata)
+{
+       size_t x;
+
+       do {
+               x = (size_t)write(fd, data, szdata);
+       } while (x == NOSIZE && errno == EINTR);
+
+       return x;
+}
index 0e90f48be408eda3a2bab9d2cec53122955dc85a..7c7b0b911d1564b9284c0e2bbc498d4c47429d32 100644 (file)
@@ -44,7 +44,7 @@ static void get_urandom(const char *src, void *buf, size_t size)
        if (fd == -1) fd = open("/dev/random", O_RDONLY);
        if (fd == -1) xerror(NO, YES, YES, "random source is required (tried %s)", src);
 
-_again:        rd = read(fd, ubuf, sz);
+_again:        rd = xread(fd, ubuf, sz);
        if (rd < sz && rd != NOSIZE) {
                ubuf += rd;
                sz -= rd;
@@ -148,7 +148,7 @@ void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes)
                if (ctr_mode != TFC_MODE_PLAIN) tfc_getrandom(srcblk, lblock);
 
                if (error_action == TFC_ERRACT_SYNC) wrpos = tfc_fdgetpos(fd);
-_wagain:       lio = write(fd, pblk, lrem);
+_wagain:       lio = xwrite(fd, pblk, lrem);
                if (lio == NOSIZE) {
                        if (errno != EIO && catch_all_errors != YES)
                                xerror(NO, NO, YES, "%s", foutname);
index 6c595e1bcd206339a44ad9c84682853ce642ac65..b3b2019d5875d446d3704ea854f8511c72f0ce34 100644 (file)
@@ -78,7 +78,7 @@ tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize re
                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);
+_again:                lio = xread(fd, pblk, lrem);
                if (lio == 0) stop = YES;
                if (lio != NOSIZE) ldone += lio;
                else {
@@ -289,7 +289,7 @@ _dohash:    if (status_timer) setup_next_alarm(status_timer);
                        for (y = 0; y < sksum_turns; y++) skein(hash, bits, mackey_opt ? mackey : NULL, hash, TF_FROM_BITS(bits));
                }
                if (do_outfmt == TFC_OUTFMT_B64) tfc_printbase64(stdout, hash, TF_FROM_BITS(bits), 0);
-               else if (do_outfmt == TFC_OUTFMT_RAW) write(1, hash, TF_FROM_BITS(bits));
+               else if (do_outfmt == TFC_OUTFMT_RAW) xwrite(1, hash, TF_FROM_BITS(bits));
                else mhexdump(hash, TF_FROM_BITS(bits), TF_FROM_BITS(bits), 0);
                if (do_outfmt != TFC_OUTFMT_RAW) {
                        if (quiet == NO || xx > 1) tfc_say("\t%s", fargv[x] ? fargv[x] : "-");
index 07939a74ddbd8de92cf40b8cfeab539bdb0b0e8a..8608cf16011399202e66f08b8855211c6368a56e 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -482,7 +482,7 @@ int main(int argc, char **argv)
                if (!strcmp(saltf, "-")) saltfd = 0;
                else saltfd = open(saltf, O_RDONLY | O_LARGEFILE);
                if (saltfd == -1) xerror(NO, NO, YES, "%s", saltf);
-               lio = read(saltfd, tfc_salt, TFC_MAX_SALT - TF_FROM_BITS(TFC_KEY_BITS));
+               lio = xread(saltfd, tfc_salt, TFC_MAX_SALT - TF_FROM_BITS(TFC_KEY_BITS));
                if (lio == NOSIZE) xerror(NO, NO, YES, "%s", saltf);
                tfc_saltsz = lio;
                xclose(saltfd);
@@ -506,7 +506,7 @@ _nosalt:
                        ldone = 0;
                        lrem = lblock = sizeof(tmpdata);
                        if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(mkfd);
-_mkragain:             lio = read(mkfd, pblk, lrem);
+_mkragain:             lio = xread(mkfd, pblk, lrem);
                        if (lio == 0) do_stop = YES;
                        if (lio != NOSIZE) ldone += lio;
                        else {
@@ -593,7 +593,7 @@ _mkragain:          lio = read(mkfd, pblk, lrem);
                if (!strcmp(tweakf, "-")) twfd = 0;
                else twfd = open(tweakf, O_RDONLY | O_LARGEFILE);
                if (twfd == -1) xerror(NO, NO, YES, "%s", tweakf);
-               lio = ldone = read(twfd, key+TF_FROM_BITS(TF_MAX_BITS)+TF_SIZE_UNIT, 2*TF_SIZE_UNIT);
+               lio = ldone = xread(twfd, key+TF_FROM_BITS(TF_MAX_BITS)+TF_SIZE_UNIT, 2*TF_SIZE_UNIT);
                if (lio == NOSIZE) xerror(NO, NO, YES, "%s", tweakf);
                if (ldone < 2*TF_SIZE_UNIT)
                        xerror(NO, NO, YES, "%s: %zu bytes tweak required", tweakf, 2*TF_SIZE_UNIT);
@@ -642,7 +642,7 @@ _nokeyfd:
                if (!strcmp(counter_file, "-")) ctrfd = 0;
                else ctrfd = open(counter_file, O_RDONLY | O_LARGEFILE);
                if (ctrfd == -1) xerror(NO, NO, YES, "%s", counter_file);
-               lio = read(ctrfd, ctr, ctrsz);
+               lio = xread(ctrfd, ctr, ctrsz);
                if (lio == NOSIZE) xerror(NO, NO, YES, "%s", counter_file);
                if (lio < ctrsz) xerror(NO, YES, YES, "counter file is too small (%zu)!", lio);
                xclose(ctrfd);
@@ -652,7 +652,7 @@ _nokeyfd:
                ldone = 0;
                lrem = lblock = ctrsz;
                if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_ctrragain:    lio = read(sfd, pblk, lrem);
+_ctrragain:    lio = xread(sfd, pblk, lrem);
                if (lio != NOSIZE) ldone += lio;
                else {
                        if (errno != EIO && catch_all_errors != YES)
@@ -697,7 +697,7 @@ _ctrskip1:
 _xts2key:      ldone = 0;
                lrem = lblock = TF_FROM_BITS(TFC_KEY_BITS);
                if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(kfd);
-_keyragain:    lio = read(kfd, pblk, lrem);
+_keyragain:    lio = xread(kfd, pblk, lrem);
                if (lio != NOSIZE) ldone += lio;
                else {
                        if (errno != EIO && catch_all_errors != YES)
@@ -840,7 +840,7 @@ _pwdagain:  memset(&getps, 0, sizeof(struct getpasswd_state));
                if (!strcmp(genkeyf, "-")) krfd = 1;
                else krfd = open(genkeyf, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666);
                if (krfd == -1) xerror(NO, NO, YES, "%s", genkeyf);
-_xts2genkey:   if (write(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == -1) xerror(NO, NO, YES, "%s", genkeyf);
+_xts2genkey:   if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerror(NO, NO, YES, "%s", genkeyf);
                if (do_fsync && fsync(krfd) == -1) xerror(NO, NO, YES, "%s", genkeyf);
                if (verbose && xtskeyset == NO) {
                        tfc_esay("%s: password hashing done", progname);
@@ -896,7 +896,7 @@ _xts2genkey:        if (write(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == -1) xerror(NO,
                case TFC_CTR_SHOW:
                        switch (do_outfmt) {
                                case TFC_OUTFMT_B64: tfc_printbase64(stderr, ctr, ctrsz, YES); break;
-                               case TFC_OUTFMT_RAW: write(2, ctr, ctrsz); break;
+                               case TFC_OUTFMT_RAW: xwrite(2, ctr, ctrsz); break;
                                case TFC_OUTFMT_HEX: mehexdump(ctr, ctrsz, ctrsz, YES); break;
                        }
                        break;
@@ -960,7 +960,7 @@ _plain:
                pblk = ctr;
                lio = lrem = ctrsz;
                ldone = 0;
-_ctrwagain:    lio = write(dfd, pblk, lrem);
+_ctrwagain:    lio = xwrite(dfd, pblk, lrem);
                if (lio != NOSIZE) ldone += lio;
                else xerror(NO, NO, NO, "%s", dstfname);
                if (do_fsync && fsync(dfd) == -1) xerror(NO, NO, NO, "%s", dstfname);
@@ -981,7 +981,7 @@ _ctrwagain: lio = write(dfd, pblk, lrem);
                ldone = 0;
                lrem = lblock = blk_len_adj(maxlen, total_processed_src, blksize);
                if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_ragain:       lio = read(sfd, pblk, lrem);
+_ragain:       lio = xread(sfd, pblk, lrem);
                if (lio == 0) do_stop = TFC_STOP_BEGAN;
                if (lio != NOSIZE) ldone += lio;
                else {
@@ -1047,7 +1047,7 @@ _ragain:  lio = read(sfd, pblk, lrem);
                pblk = dstblk;
                lrem = ldone;
                ldone = 0;
-_wagain:       lio = write(dfd, pblk, lrem);
+_wagain:       lio = xwrite(dfd, pblk, lrem);
                if (lio != NOSIZE) ldone += lio;
                else xerror(NO, NO, NO, "%s", dstfname);
                if (do_fsync && fsync(dfd) == -1) xerror(NO, NO, NO, "%s", dstfname);
@@ -1071,7 +1071,7 @@ _nowrite: total_processed_dst += ldone;
                        ldone = 0;
                        lrem = lblock = TF_FROM_BITS(macbits);
                        if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_macragain:            lio = read(sfd, pblk, lrem);
+_macragain:            lio = xread(sfd, pblk, lrem);
                        if (lio != NOSIZE) ldone += lio;
                        else {
                                if (errno != EIO && catch_all_errors != YES)
@@ -1102,7 +1102,7 @@ _macragain:               lio = read(sfd, pblk, lrem);
                        if (!strcmp(do_mac_file, "-")) mfd = 0;
                        else mfd = open(do_mac_file, O_RDONLY | O_LARGEFILE);
                        if (mfd == -1) xerror(YES, NO, NO, "%s", do_mac_file);
-                       lio = ldone = read(mfd, tmpdata, sizeof(tmpdata));
+                       lio = ldone = xread(mfd, tmpdata, sizeof(tmpdata));
                        if (lio == NOSIZE) xerror(NO, NO, YES, "%s", do_mac_file);
                        if (!memcmp(tmpdata, TFC_ASCII_TFC_MAC_FOURCC, TFC_ASCII_TFC_MAC_FOURCC_LEN)) {
                                memmove(tmpdata, tmpdata+TFC_ASCII_TFC_MAC_FOURCC_LEN,
@@ -1167,7 +1167,7 @@ _shortmac:        memset(macvrfy, 0, sizeof(macvrfy));
                        pblk = tmpdata;
                        lio = lrem = TF_FROM_BITS(macbits);
                        ldone = 0;
-_macwagain:            lio = write(dfd, pblk, lrem);
+_macwagain:            lio = xwrite(dfd, pblk, lrem);
                        if (lio != NOSIZE) ldone += lio;
                        else xerror(NO, NO, NO, "%s", dstfname);
                        if (do_fsync && fsync(dfd) == -1) xerror(NO, NO, NO, "%s", dstfname);
@@ -1195,9 +1195,9 @@ _macwagain:               lio = write(dfd, pblk, lrem);
                                        tmpdata[lrem] = '\n';
                                        lrem++;
                                }
-                               lio = write(mfd, tmpdata, lrem);
+                               lio = xwrite(mfd, tmpdata, lrem);
                        }
-                       else lio = write(mfd, tmpdata, TF_FROM_BITS(macbits));
+                       else lio = xwrite(mfd, tmpdata, TF_FROM_BITS(macbits));
                        if (lio == NOSIZE) xerror(NO, NO, YES, "%s", do_mac_file);
                        if (do_fsync && fsync(mfd) == -1) xerror(NO, NO, YES, "%s", do_mac_file);
                        xclose(mfd);
index 5c68552ebeaa92cc5d6d1de7b01e8027e69576e0..19aa726ee022dda096fd8d6a76d2612232e50c75 100644 (file)
--- a/tfcrypt.h
+++ b/tfcrypt.h
@@ -157,6 +157,9 @@ extern tfc_useconds status_timer, bench_timer;
 extern tfc_useconds current_time, delta_time;
 extern struct getpasswd_state getps;
 
+size_t xread(int fd, void *data, size_t szdata);
+size_t xwrite(int fd, const void *data, size_t szdata);
+
 void xerror(tfc_yesno noexit, tfc_yesno noerrno, tfc_yesno nostats, const char *fmt, ...);
 void xexit(int status);
 void usage(void);