[ofa-general] Re: [PATCH] opensm/osm_subnet.c Fix memory leak for QOS string parameters.
Eli Dorfman (Voltaire)
dorfman.eli at gmail.com
Wed Jan 14 22:43:23 PST 2009
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?
Thanks,
Eli
More information about the general
mailing list