Skip to content

Commit 8da4729

Browse files
authored
key lookup failure should always return EACCES
spa_do_crypt_abd() already maps a missing key to EACCES. However spa_do_crypt_mac_abd(), spa_do_crypt_objset_mac_abd(), and spa_crypt_get_salt() still return the raw spa_keystore_lookup_key() error (ENOENT). This is inconsistent As we want to treat all “no key” failures as a permission failure. Standardize on EACCES for the unloaded-key case. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alek Pinchuk <alek.pinchuk@connectwise.com> Closes #18448
1 parent 9dd3c65 commit 8da4729

2 files changed

Lines changed: 18 additions & 37 deletions

File tree

module/zfs/arc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1874,7 +1874,7 @@ arc_hdr_authenticate(arc_buf_hdr_t *hdr, spa_t *spa, uint64_t dsobj)
18741874

18751875
if (ret == 0)
18761876
arc_hdr_clear_flags(hdr, ARC_FLAG_NOAUTH);
1877-
else if (ret == ENOENT)
1877+
else if (ret == EACCES)
18781878
ret = 0;
18791879

18801880
if (free_abd)

module/zfs/dsl_crypt.c

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,23 +2677,16 @@ int
26772677
spa_crypt_get_salt(spa_t *spa, uint64_t dsobj, uint8_t *salt)
26782678
{
26792679
int ret;
2680-
dsl_crypto_key_t *dck = NULL;
2680+
dsl_crypto_key_t *dck;
26812681

26822682
/* look up the key from the spa's keystore */
26832683
ret = spa_keystore_lookup_key(spa, dsobj, FTAG, &dck);
26842684
if (ret != 0)
2685-
goto error;
2685+
return (SET_ERROR(EACCES));
26862686

26872687
ret = zio_crypt_key_get_salt(&dck->dck_key, salt);
2688-
if (ret != 0)
2689-
goto error;
2690-
26912688
spa_keystore_dsl_key_rele(spa, dck, FTAG);
2692-
return (0);
26932689

2694-
error:
2695-
if (dck != NULL)
2696-
spa_keystore_dsl_key_rele(spa, dck, FTAG);
26972690
return (ret);
26982691
}
26992692

@@ -2708,25 +2701,27 @@ spa_do_crypt_objset_mac_abd(boolean_t generate, spa_t *spa, uint64_t dsobj,
27082701
abd_t *abd, uint_t datalen, boolean_t byteswap)
27092702
{
27102703
int ret;
2711-
dsl_crypto_key_t *dck = NULL;
2712-
void *buf = abd_borrow_buf_copy(abd, datalen);
2713-
objset_phys_t *osp = buf;
2704+
dsl_crypto_key_t *dck;
27142705
uint8_t portable_mac[ZIO_OBJSET_MAC_LEN];
27152706
uint8_t local_mac[ZIO_OBJSET_MAC_LEN];
27162707
const uint8_t zeroed_mac[ZIO_OBJSET_MAC_LEN] = {0};
27172708

27182709
/* look up the key from the spa's keystore */
27192710
ret = spa_keystore_lookup_key(spa, dsobj, FTAG, &dck);
27202711
if (ret != 0)
2721-
goto error;
2712+
return (SET_ERROR(EACCES));
2713+
2714+
void *buf = abd_borrow_buf_copy(abd, datalen);
2715+
objset_phys_t *osp = buf;
27222716

27232717
/* calculate both HMACs */
27242718
ret = zio_crypt_do_objset_hmacs(&dck->dck_key, buf, datalen,
27252719
byteswap, portable_mac, local_mac);
2726-
if (ret != 0)
2727-
goto error;
2728-
27292720
spa_keystore_dsl_key_rele(spa, dck, FTAG);
2721+
if (ret != 0) {
2722+
abd_return_buf(abd, buf, datalen);
2723+
return (ret);
2724+
}
27302725

27312726
/* if we are generating encode the HMACs in the objset_phys_t */
27322727
if (generate) {
@@ -2760,38 +2755,30 @@ spa_do_crypt_objset_mac_abd(boolean_t generate, spa_t *spa, uint64_t dsobj,
27602755
}
27612756

27622757
abd_return_buf(abd, buf, datalen);
2763-
27642758
return (0);
2765-
2766-
error:
2767-
if (dck != NULL)
2768-
spa_keystore_dsl_key_rele(spa, dck, FTAG);
2769-
abd_return_buf(abd, buf, datalen);
2770-
return (ret);
27712759
}
27722760

27732761
int
27742762
spa_do_crypt_mac_abd(boolean_t generate, spa_t *spa, uint64_t dsobj, abd_t *abd,
27752763
uint_t datalen, uint8_t *mac)
27762764
{
27772765
int ret;
2778-
dsl_crypto_key_t *dck = NULL;
2779-
uint8_t *buf = abd_borrow_buf_copy(abd, datalen);
2766+
dsl_crypto_key_t *dck;
27802767
uint8_t digestbuf[ZIO_DATA_MAC_LEN];
27812768

27822769
/* look up the key from the spa's keystore */
27832770
ret = spa_keystore_lookup_key(spa, dsobj, FTAG, &dck);
27842771
if (ret != 0)
2785-
goto error;
2772+
return (SET_ERROR(EACCES));
27862773

2774+
uint8_t *buf = abd_borrow_buf_copy(abd, datalen);
27872775
/* perform the hmac */
27882776
ret = zio_crypt_do_hmac(&dck->dck_key, buf, datalen,
27892777
digestbuf, ZIO_DATA_MAC_LEN);
2790-
if (ret != 0)
2791-
goto error;
2792-
2793-
abd_return_buf(abd, buf, datalen);
27942778
spa_keystore_dsl_key_rele(spa, dck, FTAG);
2779+
abd_return_buf(abd, buf, datalen);
2780+
if (ret != 0)
2781+
return (ret);
27952782

27962783
/*
27972784
* Truncate and fill in mac buffer if we were asked to generate a MAC.
@@ -2806,12 +2793,6 @@ spa_do_crypt_mac_abd(boolean_t generate, spa_t *spa, uint64_t dsobj, abd_t *abd,
28062793
return (SET_ERROR(ECKSUM));
28072794

28082795
return (0);
2809-
2810-
error:
2811-
if (dck != NULL)
2812-
spa_keystore_dsl_key_rele(spa, dck, FTAG);
2813-
abd_return_buf(abd, buf, datalen);
2814-
return (ret);
28152796
}
28162797

28172798
/*

0 commit comments

Comments
 (0)