net/mlx5e: Fix macsec possible null dereference when updating MAC security entity...
authorEmeel Hakim <ehakim@nvidia.com>
Sun, 11 Dec 2022 11:22:23 +0000 (13:22 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 10 Jan 2023 06:08:37 +0000 (22:08 -0800)
Upon updating MAC security entity (SecY) in hw offload path, the macsec
security association (SA) initialization routine is called. In case of
extended packet number (epn) is enabled the salt and ssci attributes are
retrieved using the MACsec driver rx_sa context which is unavailable when
updating a SecY property such as encoding-sa hence the null dereference.
Fix by using the provided SA to set those attributes.

Fixes: 4411a6c0abd3 ("net/mlx5e: Support MACsec offload extended packet number (EPN)")
Signed-off-by: Emeel Hakim <ehakim@nvidia.com>
Reviewed-by: Raed Salem <raeds@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c

index cf7b3bb..7f6b940 100644 (file)
@@ -359,7 +359,6 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx,
        struct mlx5_core_dev *mdev = priv->mdev;
        struct mlx5_macsec_obj_attrs obj_attrs;
        union mlx5e_macsec_rule *macsec_rule;
-       struct macsec_key *key;
        int err;
 
        obj_attrs.next_pn = sa->next_pn;
@@ -369,13 +368,9 @@ static int mlx5e_macsec_init_sa(struct macsec_context *ctx,
        obj_attrs.aso_pdn = macsec->aso.pdn;
        obj_attrs.epn_state = sa->epn_state;
 
-       key = (is_tx) ? &ctx->sa.tx_sa->key : &ctx->sa.rx_sa->key;
-
        if (sa->epn_state.epn_enabled) {
-               obj_attrs.ssci = (is_tx) ? cpu_to_be32((__force u32)ctx->sa.tx_sa->ssci) :
-                                          cpu_to_be32((__force u32)ctx->sa.rx_sa->ssci);
-
-               memcpy(&obj_attrs.salt, &key->salt, sizeof(key->salt));
+               obj_attrs.ssci = cpu_to_be32((__force u32)sa->ssci);
+               memcpy(&obj_attrs.salt, &sa->salt, sizeof(sa->salt));
        }
 
        obj_attrs.replay_window = ctx->secy->replay_window;