[ofa-general] Re: [PATCH] opensm/osm_subnet.c Fix memory leak for QOS string parameters.

Sasha Khapyorsky sashak at voltaire.com
Thu Jan 15 05:54:45 PST 2009


On 08:43 Thu 15 Jan     , Eli Dorfman (Voltaire) wrote:
> Sasha Khapyorsky wrote:
> > Hi Eli,
> > 
> > On 13:54 Sun 21 Dec     , Eli Dorfman (Voltaire) wrote:
> >> Fix memory leak for QOS string parameters.
> >>
> >>  Signed-off-by: Slava Strebkov <slavas at amirm.voltaire.com>
> >>
> >> ---
> >>  opensm/opensm/osm_subnet.c |   21 +++++++++++++++++++++
> >>  1 files changed, 21 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c
> >> index 122d4dd..f8b29f8 100644
> >> --- a/opensm/opensm/osm_subnet.c
> >> +++ b/opensm/opensm/osm_subnet.c
> >> @@ -331,6 +331,21 @@ static void subn_init_qos_options(IN osm_qos_options_t * opt)
> >>  	opt->sl2vl = NULL;
> >>  }
> >>  
> >> +static void subn_free_qos_options(IN osm_qos_options_t * opt)
> >> +{
> >> +	if ((opt->vlarb_high) && (opt->vlarb_high != OSM_DEFAULT_QOS_VLARB_HIGH)) {
> >> +		free(opt->vlarb_high);
> >> +	}
> >> +
> >> +	if ((opt->vlarb_low) && (opt->vlarb_low != OSM_DEFAULT_QOS_VLARB_LOW)) {
> >> +		free(opt->vlarb_low);
> >> +	}
> >> +
> >> +	if ((opt->sl2vl) && (opt->sl2vl != OSM_DEFAULT_QOS_SL2VL)) {
> >> +		free(opt->sl2vl);
> >> +	}
> >> +}
> > 
> > With gcc-4.3.2 using '-Wall' flag I get warning here:
> > 
> > "comparison with string literal results in unspecified behavior"
> > 
> > It is actually true since used OSM_DEFAULT_QOS_* macros are defined as
> > strings - it is something equal to:
> > 
> > 	char *p = "123456";
> > 
> > 	....
> > 
> > 	if (p != "123456")
> > 		free(p1);
> > 
> > Gcc is smart enough and uses the same string constant "123456" in both
> > cases (so your patch actually works), but don't think that it is
> > guaranteed in C language.
> > 
> > So I think to rework this part - we can always allocate string qos config
> > parameters (just similar to other config), and free it when it is not
> > NULL. Something like this:
> > 
> > 
> > diff --git a/opensm/opensm/osm_subnet.c b/opensm/opensm/osm_subnet.c
> > index a6db304..94b6332 100644
> > --- a/opensm/opensm/osm_subnet.c
> > +++ b/opensm/opensm/osm_subnet.c
> > @@ -333,13 +333,13 @@ static void subn_init_qos_options(IN osm_qos_options_t * opt)
> >  
> >  static void subn_free_qos_options(IN osm_qos_options_t * opt)
> >  {
> > -	if (opt->vlarb_high && opt->vlarb_high != OSM_DEFAULT_QOS_VLARB_HIGH)
> > +	if (opt->vlarb_high)
> >  		free(opt->vlarb_high);
> >  
> > -	if (opt->vlarb_low && opt->vlarb_low != OSM_DEFAULT_QOS_VLARB_LOW)
> > +	if (opt->vlarb_low)
> >  		free(opt->vlarb_low);
> >  
> > -	if (opt->sl2vl && opt->sl2vl != OSM_DEFAULT_QOS_SL2VL)
> > +	if (opt->sl2vl)
> >  		free(opt->sl2vl);
> >  }
> >  
> > @@ -803,7 +803,7 @@ static void subn_verify_vlarb(char **vlarb, const char *prefix,
> >  	if (*vlarb == NULL) {
> >  		log_report(" Invalid Cached Option: %s_vlarb_%s: "
> >  		"Using Default\n", prefix, suffix);
> > -		*vlarb = dflt;
> > +		*vlarb = strdup(dflt);
> >  		return;
> >  	}
> >  
> > @@ -872,7 +872,7 @@ static void subn_verify_sl2vl(char **sl2vl, const char *prefix, char *dflt)
> >  	if (*sl2vl == NULL) {
> >  		log_report(" Invalid Cached Option: %s_sl2vl: Using Default\n",
> >  			   prefix);
> > -		*sl2vl = dflt;
> > +		*sl2vl = strdup(dflt);
> >  		return;
> >  	}
> > 
> > 
> > Thoughts?
> 
> looks cleaner. will you commit this?

I will.

Sasha



More information about the general mailing list