Linux: Fix uninitialized variable usage in zio_do_crypt_data()

Coverity complained about this. An error from `hkdf_sha512()` before uio
initialization will cause pointers to uninitialized memory to be passed
to `zio_crypt_destroy_uio()`. This is a regression that was introduced
by cf63739191. Interestingly, this never
affected FreeBSD, since the FreeBSD version never had that patch ported.
Since moving uio initialization to the top of this function would slow
down the qat_crypt() path, we only move the `memset()` calls to the top
of the function. This is sufficient to fix this problem.

Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Neal Gompa <ngompa@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13944
This commit is contained in:
Richard Yao 2022-09-26 19:44:22 -04:00 committed by Tony Hutter
parent 33223cbc3c
commit 835e03682c
1 changed files with 3 additions and 3 deletions

View File

@ -1900,6 +1900,9 @@ zio_do_crypt_data(boolean_t encrypt, zio_crypt_key_t *key,
crypto_ctx_template_t tmpl; crypto_ctx_template_t tmpl;
uint8_t *authbuf = NULL; uint8_t *authbuf = NULL;
memset(&puio, 0, sizeof (puio));
memset(&cuio, 0, sizeof (cuio));
/* /*
* If the needed key is the current one, just use it. Otherwise we * If the needed key is the current one, just use it. Otherwise we
* need to generate a temporary one from the given salt + master key. * need to generate a temporary one from the given salt + master key.
@ -1960,9 +1963,6 @@ zio_do_crypt_data(boolean_t encrypt, zio_crypt_key_t *key,
/* If the hardware implementation fails fall back to software */ /* If the hardware implementation fails fall back to software */
} }
bzero(&puio, sizeof (zfs_uio_t));
bzero(&cuio, sizeof (zfs_uio_t));
/* create uios for encryption */ /* create uios for encryption */
ret = zio_crypt_init_uios(encrypt, key->zk_version, ot, plainbuf, ret = zio_crypt_init_uios(encrypt, key->zk_version, ot, plainbuf,
cipherbuf, datalen, byteswap, mac, &puio, &cuio, &enc_len, cipherbuf, datalen, byteswap, mac, &puio, &cuio, &enc_len,