***SPAM*** [ofa-general] [PATCH] opensm/osm_mcast_tbl.c wrong max mcast lid cause the sm to set invalid MFT block.

Hal Rosenstock hal.rosenstock at gmail.com
Thu Nov 13 09:56:46 PST 2008


Hi Eli,

On Thu, Nov 13, 2008 at 10:51 AM, Eli Dorfman <dorfman.eli at gmail.com> wrote:
> wrong max mcast lid cause the sm to set invalid MFT block.
> when mcmember tries to set mcast lid beyond mcast capability (e.g. 0xc400),
> the sm accepts this and tries to set invalid block.

Good find (and nice test case).

Do the switch SMA's reject those invalid sets ? I'm hoping that's the case.

See below for minor question on the patch.

> Signed-off-by: Eli Dorfman <elid at voltaire.com>
>
> ---
>  opensm/opensm/osm_mcast_tbl.c          |    6 +++---
>  opensm/opensm/osm_sa_mcmember_record.c |    2 +-
>  2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/opensm/opensm/osm_mcast_tbl.c b/opensm/opensm/osm_mcast_tbl.c
> index 92fbb63..17fb69c 100644
> --- a/opensm/opensm/osm_mcast_tbl.c
> +++ b/opensm/opensm/osm_mcast_tbl.c
> @@ -81,7 +81,7 @@ osm_mcast_tbl_init(IN osm_mcast_tbl_t * const p_tbl,
>                                                IB_MCAST_BLOCK_SIZE) /
>                                        IB_MCAST_BLOCK_SIZE) - 1);
>
> -       p_tbl->max_mlid_ho = (uint16_t) (IB_LID_MCAST_START_HO + capacity);
> +       p_tbl->max_mlid_ho = (uint16_t) (IB_LID_MCAST_START_HO + capacity - 1);
>
>        /*
>           The number of bytes needed in the mask table is:
> @@ -216,7 +216,7 @@ osm_mcast_tbl_set_block(IN osm_mcast_tbl_t * const p_tbl,
>
>        mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE);
>
> -       if (mlid_start_ho + IB_MCAST_BLOCK_SIZE > p_tbl->max_mlid_ho)
> +       if (mlid_start_ho + IB_MCAST_BLOCK_SIZE - 1 > p_tbl->max_mlid_ho)
>                return (IB_INVALID_PARAMETER);
>
>        for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++)
> @@ -274,7 +274,7 @@ osm_mcast_tbl_get_block(IN osm_mcast_tbl_t * const p_tbl,
>
>        mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE);
>
> -       if (mlid_start_ho + IB_MCAST_BLOCK_SIZE > p_tbl->max_mlid_ho)
> +       if (mlid_start_ho + IB_MCAST_BLOCK_SIZE - 1 > p_tbl->max_mlid_ho)
>                return (IB_INVALID_PARAMETER);
>
>        for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++)
> diff --git a/opensm/opensm/osm_sa_mcmember_record.c b/opensm/opensm/osm_sa_mcmember_record.c
> index 5dd286a..6007b06 100644
> --- a/opensm/opensm/osm_sa_mcmember_record.c
> +++ b/opensm/opensm/osm_sa_mcmember_record.c
> @@ -846,7 +846,7 @@ osm_mcmr_rcv_create_new_mgrp(IN osm_sa_t * sa,
>        mlid = __get_new_mlid(sa, mcm_rec.mlid);
>        if (mlid == 0) {
>                OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1B19: "
> -                       "__get_new_mlid failed\n");
> +                       "__get_new_mlid failed request mlid 0x%04x\n", mcm_rec.mlid);

                            ^^^^^^^^^^^^^^^^
Should this be cl_ntoh16(mcm_rec.mlid) ?

-- Hal

>                status = IB_SA_MAD_STATUS_NO_RESOURCES;
>                goto Exit;
>        }
> --
> 1.5.5
>
> _______________________________________________
> general mailing list
> general at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
>
> To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
>



More information about the general mailing list