[openib-general] Re: [PATCH] osm: segfault fix in osm_get_gid_by_mad_addr (take 2)

2006-06-05 Thread Hal Rosenstock
On Mon, 2006-06-05 at 08:34, Eitan Zahavi wrote:
> Hi Hal
> 
> I got a report regarding crashes in osm_get_gid_by_mad_addr.
> It was missing a check on p_port looked up by LID. The affected
> flows are reports and multicast joins.
> 
> The fix modified the function to return status (instead of GID).
> I did run some simulation flows after the fix but please double
> check before commit.
> 
> This time I hope I did not missed anything
> 
> Eitan
> 
> Signed-off-by:  Eitan Zahavi <[EMAIL PROTECTED]>

Thanks.  Applied (with some cosmetic changes) to both trunk and 1.0
branch.

-- Hal

___
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general



[openib-general] RE: [PATCH] osm: segfault fix in osm_get_gid_by_mad_addr

2006-06-05 Thread Eitan Zahavi
Hi Hal,

I will re-send the patch with fixes.
I also replied to the comments below

> See comments below.
> 
> >  p_physp = osm_port_get_phys_ptr( p_port,
p_port->default_port_num);
> > -request_gid.unicast.interface_id = p_physp->port_guid;
> > -request_gid.unicast.prefix = p_subn->opt.subnet_prefix;
> > +p_gid->unicast.interface_id = p_physp->port_guid;
> > +p_gid->unicast.prefix = p_subn->opt.subnet_prefix;
> >}
> >else
> >{
> 
> Isn't an error status needed to be returned for this else ?
[EZ] Correct
> 
> > @@ -382,8 +383,24 @@ osm_infr_rcv_process_set_method(
> >inform_info_rec.inform_record.subscriber_enum = 0;
> >
> >/* update the subscriber GID according to mad address */
> > -  inform_info_rec.inform_record.subscriber_gid =
> > -osm_get_gid_by_mad_addr( p_rcv->p_log, p_rcv->p_subn, &p_madw-
> >mad_addr );
> > +  res = osm_get_gid_by_mad_addr(
> > +p_rcv->p_log,
> > +p_rcv->p_subn,
> > +&p_madw->mad_addr,
> > +&inform_info_rec.inform_record.subscriber_gid);
> > +  if ( res != NULL )
> 
> Should this be IB_SUCCESS rather than NULL ?
[EZ] True.
> 
> > +  {
> > * MODIFICATIONS DONE ON INCOMING REQUEST:
> > Index: opensm/osm_sa_mcmember_record.c
> > ===
> > --- opensm/osm_sa_mcmember_record.c (revision 7670)
> > +++ opensm/osm_sa_mcmember_record.c (working copy)
> > @@ -437,12 +437,21 @@ __add_new_mgrp_port(
> >  {
> >boolean_t proxy_join;
> >ib_gid_t requester_gid;
> > +  ib_api_status_t res;
> >
> >/* set the proxy_join if the requester gid is not identical to
the
> >   joined gid */
> > -  requester_gid = osm_get_gid_by_mad_addr( p_rcv->p_log,
> > +  res = osm_get_gid_by_mad_addr( p_rcv->p_log,
> > p_rcv->p_subn,
> > -   p_mad_addr );
> > + p_mad_addr, &requester_gid );
> > +  if ( res != IB_SUCCESS )
> > +  {
> > +osm_log( p_rcv->p_log, OSM_LOG_ERROR,
> > + "__add_new_mgrp_port: ERR 1B22: "
> > + "Could not find GUID for requestor.\n" );
> 
> ERR 1B22 is already in use.
[EZ] OK last was 1B28 using 1B29
> 
> > +
> > +return IB_INVALID_PARAMETER;
> > +  }
> 
> Also, based on this change, the caller of __add_new_mgrp_port should
not
> just send SA error with IB_SA_MAD_STATUS_NO_RESOURCES but rather base
it
> off the error status now.
[EZ] Correct. But I think there is no error message that fits exactly
the case where the requester is not known to the SM. I will use invalid
parameter.
> 
> -- Hal
> 
> >if (!memcmp(&p_recvd_mcmember_rec->port_gid, &requester_gid,
> >sizeof(ib_gid_t)))
> > @@ -755,6 +764,7 @@ __validate_modify(IN osm_mcmr_recv_t* co
> >ib_net64_t portguid;
> >ib_gid_t request_gid;
> >osm_physp_t* p_request_physp;
> > +  ib_api_status_t res;
> >
> >portguid = p_recvd_mcmember_rec->port_gid.unicast.interface_id;
> >
> > @@ -775,9 +785,19 @@ __validate_modify(IN osm_mcmr_recv_t* co
> >{
> >  /* The proxy_join is not set. Modifying can by done only
> > if the requester GID == PortGID */
> > -request_gid = osm_get_gid_by_mad_addr(p_rcv->p_log,
> > +res = osm_get_gid_by_mad_addr(p_rcv->p_log,
> >p_rcv->p_subn,
> > -  p_mad_addr );
> > +  p_mad_addr,
> > +  &request_gid);
> > +
> > +if ( res != IB_SUCCESS )
> > +{
> > +  osm_log( p_rcv->p_log, OSM_LOG_DEBUG,
> > +   "__validate_modify: "
> > +   "Could not find any port by given request
address.\n"
> > +   );
> > +  return FALSE;
> > +}
> >
> >  if (memcmp(&((*pp_mcm_port)->port_gid), &request_gid,
sizeof(ib_gid_t)))
> >  {
> >
___
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general



[openib-general] Re: [PATCH] osm: segfault fix in osm_get_gid_by_mad_addr

2006-06-05 Thread Hal Rosenstock
Hi Eitan,

On Mon, 2006-06-05 at 05:36, Eitan Zahavi wrote:
> Hi Hal
> 
> I got a report regarding crashes in osm_get_gid_by_mad_addr.
> It was missing a check on p_port looked up by LID. The affected
> flows are reports and multicast joins.
> 
> The fix modified the function to return status (instead of GID).
> I did run some simulation flows after the fix but please double
> check before commit.

See comments below.

> Eitan
> 
> Signed-off-by:  Eitan Zahavi <[EMAIL PROTECTED]>
> 
> Index: include/opensm/osm_subnet.h
> ===
> --- include/opensm/osm_subnet.h   (revision 7542)
> +++ include/opensm/osm_subnet.h   (working copy)
> @@ -770,11 +770,12 @@ struct _osm_port;
>  *
>  * SYNOPSIS
>  */
> -ib_gid_t
> +ib_api_status_t
>  osm_get_gid_by_mad_addr(
> IN struct _osm_log  *p_log,
> IN const osm_subn_t *p_subn,
> - IN const struct _osm_mad_addr *p_mad_addr );
> + IN const struct _osm_mad_addr *p_mad_addr,
> +   OUT ib_gid_t*p_gid);
>  /*
>  * PARAMETERS
>  *  p_log
> @@ -786,8 +787,11 @@ osm_get_gid_by_mad_addr(
>  *p_mad_addr
>  *[in] Pointer to mad address object.
>  *
> +*  p_gid
> +* [out] Pointer to teh GID structure to fill in.
> +* 
>  * RETURN VALUES
> -*Requestor gid object if found. Null otherwise.
> +*IB_SUCCESS if was able to find the GID by address given
>  *
>  * NOTES
>  *
> Index: opensm/osm_subnet.c
> ===
> --- opensm/osm_subnet.c   (revision 7670)
> +++ opensm/osm_subnet.c   (working copy)
> @@ -236,16 +236,24 @@ osm_subn_init(
>  
>  /**
>   **/
> -ib_gid_t
> +ib_api_status_t
>  osm_get_gid_by_mad_addr(
>IN osm_log_t*p_log,
>IN const osm_subn_t *p_subn,
> -  IN const osm_mad_addr_t *p_mad_addr )
> +  IN const osm_mad_addr_t *p_mad_addr,
> +  OUT ib_gid_t*p_gid)
>  {
>const cl_ptr_vector_t*  p_tbl;
>const osm_port_t*   p_port = NULL;
>const osm_physp_t*  p_physp = NULL;
> -  ib_gid_trequest_gid;
> +
> +  if ( p_gid == NULL ) 
> +  {
> +osm_log( p_log, OSM_LOG_ERROR,
> + "osm_get_gid_by_mad_addr: ERR 7505 "
> + "Provided output GID is NULL\n");
> +return(IB_INVALID_PARAMETER);
> +  }
>  
>/* Find the port gid of the request in the subnet */
>p_tbl = &p_subn->port_lid_tbl;
> @@ -256,9 +264,18 @@ osm_get_gid_by_mad_addr(
>cl_ntoh16(p_mad_addr->dest_lid))
>{
>  p_port = cl_ptr_vector_get( p_tbl, cl_ntoh16(p_mad_addr->dest_lid) );
> +if ( p_port == NULL )
> +{
> +  osm_log( p_log, OSM_LOG_DEBUG,
> +   "osm_get_gid_by_mad_addr: "
> +   "Did not find any port with LID: 0x%X\n",
> +   cl_ntoh16(p_mad_addr->dest_lid)
> +   );
> +  return(IB_INVALID_PARAMETER);
> +}
>  p_physp = osm_port_get_phys_ptr( p_port, p_port->default_port_num);
> -request_gid.unicast.interface_id = p_physp->port_guid;
> -request_gid.unicast.prefix = p_subn->opt.subnet_prefix;
> +p_gid->unicast.interface_id = p_physp->port_guid;
> +p_gid->unicast.prefix = p_subn->opt.subnet_prefix;
>}
>else
>{

Isn't an error status needed to be returned for this else ?

> @@ -270,7 +287,7 @@ osm_get_gid_by_mad_addr(
>   );
>}
>  
> -  return request_gid;
> +  return( IB_SUCCESS );
>  }
>  
>  /**
> Index: opensm/osm_sa_informinfo.c
> ===
> --- opensm/osm_sa_informinfo.c(revision 7670)
> +++ opensm/osm_sa_informinfo.c(working copy)
> @@ -348,6 +348,7 @@ osm_infr_rcv_process_set_method(
>uint8_t subscribe;
>ib_net32_t qpn;
>uint8_t resp_time_val;
> +  ib_api_status_t res;
>  
>OSM_LOG_ENTER( p_rcv->p_log, osm_infr_rcv_process_set_method );
>  
> @@ -382,8 +383,24 @@ osm_infr_rcv_process_set_method(
>inform_info_rec.inform_record.subscriber_enum = 0;
>  
>/* update the subscriber GID according to mad address */
> -  inform_info_rec.inform_record.subscriber_gid =
> -osm_get_gid_by_mad_addr( p_rcv->p_log, p_rcv->p_subn, &p_madw->mad_addr 
> );
> +  res = osm_get_gid_by_mad_addr(
> +p_rcv->p_log, 
> +p_rcv->p_subn, 
> +&p_madw->mad_addr,
> +&inform_info_rec.inform_record.subscriber_gid);
> +  if ( res != NULL )

Should this be IB_SUCCESS rather than NULL ?

> +  {
> +osm_log( p_rcv->p_log, OSM_LOG_ERROR,
> + "osm_infr_rcv_process_set_method: ERR 4308 "
> + "Got Subscribe Request from unknown LID: 0x%04X\n",
> + cl_ntoh16(p_madw->mad_addr.dest_lid)
> + );
> +osm_sa_send_error(
> +  p_rcv->p_resp,
> +  p_madw,
> +