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

Sasha Khapyorsky sashak at voltaire.com
Wed Jan 14 07:42:00 PST 2009


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?

Sasha



More information about the general mailing list