fix -C stream -c rand regression.
[tfcrypt.git] / tfcrypt.c
index 2390516a2ae9b35d7b3715f82e8deb596d7d1c8b..8d01618ce361abcbf6821ff77ea7bc106bc1538c 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -65,10 +65,12 @@ int main(int argc, char **argv)
        s = (char *)srcblk;
        d = getenv("HOME");
        if (!d) d = "";
-       xstrlcat(s, d, PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX);
-       xstrlcat(s, "/.tfcrypt.defs", PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX);
+       n = PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX;
+       if (xstrlcpy(s, d, n) >= n) goto _baddfname;
+       if (xstrlcat(s, "/.tfcrypt.defs", n) >= n) goto _baddfname;
        read_defaults(s, YES);
-       memset(s, 0, PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX);
+_baddfname:
+       memset(s, 0, n);
 
        opterr = 0;
        while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:TPkzxc:l:qedn:vV:pwE:O:S:AmM:R:Z:WHD:")) != -1) {
@@ -918,8 +920,6 @@ _xts2genkey:        if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerro
        tfc_data_to_words64(&iseek_blocks, sizeof(iseek_blocks));
        tf_ctr_set(ctr, &iseek_blocks, sizeof(iseek_blocks));
 
-       if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
-
        switch (counter_opt) {
                case TFC_CTR_SHOW:
                        switch (do_outfmt) {
@@ -1001,6 +1001,8 @@ _ctrwagain:       lio = xwrite(dfd, pblk, lrem);
                delta_processed += ldone;
        }
 
+       if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
+
        errno = 0;
        do_stop = NO;
        while (1) {