<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Feb 24, 2014 at 5:00 AM, Aleksander Morgado <span dir="ltr"><<a href="mailto:aleksander@aleksander.es" target="_blank">aleksander@aleksander.es</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hey Ben,<br>
<br>
On Mon, Feb 24, 2014 at 6:27 AM, Ben Chan <<a href="mailto:benchan@chromium.org">benchan@chromium.org</a>> wrote:<br>
> ---<br>
<br>
That's wrong actually. g_strsplit () does create an array of strings<br>
in heap, but we're returning some of the contents of the array by<br>
reference. E.g. in the first chunk split[0] is returned as 'pin' and<br>
split[1] is returned as 'new_pin'. The problem here is that not every<br>
item in the split array may be returned, and that is why you may be<br>
seen memleaks. So, either we g_strdup() the returned strings and<br>
g_strfreev() the whole array afterwards, or we make sure the<br>
non-returned strings are g_free()-ed independently and leave the last<br>
g_free() for the array itself. See more comments below.<br>
<div class=""><br>
<br>
>  src/mbimcli/mbimcli-basic-connect.c | 4 ++--<br>
>  1 file changed, 2 insertions(+), 2 deletions(-)<br>
><br>
> diff --git a/src/mbimcli/mbimcli-basic-connect.c b/src/mbimcli/mbimcli-basic-connect.c<br>
> index 97368aa..9208d71 100644<br>
> --- a/src/mbimcli/mbimcli-basic-connect.c<br>
> +++ b/src/mbimcli/mbimcli-basic-connect.c<br>
> @@ -642,7 +642,7 @@ set_pin_input_parse (guint         n_expected,<br>
>      *pin = split[0];<br>
>      *new_pin = split[1] ? split[1] : NULL;<br>
><br>
> -    g_free (split);<br>
> +    g_strfreev (split);<br>
<br>
</div>There shouldn't be any leak here, both split[0] and split[1] get<br>
returned, and we end up freeing the split array (not its contents).<br>
<div class=""><br>
>      return TRUE;<br>
>  }<br>
><br>
> @@ -784,7 +784,7 @@ set_connect_activate_parse (const gchar       *str,<br>
>          }<br>
>      }<br>
><br>
> -    g_free (split);<br>
> +    g_strfreev (split);<br>
<br>
</div>In this case, I believe that only split[1] is being leaked. A simple<br>
g_free(split[1]) would be enough, right?<br>
<br>
>      return TRUE;<br>
>  }<br>
<span class="HOEnZb"><font color="#888888">><br>
> --<br>
> 1.9.0.rc1.175.g0b1dcb5<br>
><br>
<br></font></span></blockquote><div><br></div><div>Aleksander,</div><div><br></div><div>How about g_strdup the strings being returned, and then g_strfreev the string array? That's less efficient but makes the ownership transfer of the allocated strings more obvious. Also, we don't need to assume how g_strsplit actually allocates the string array as the glib API only suggests using g_strfreev.  How do you think?</div>

<div><br></div><div>Thanks,</div><div>Ben</div><div><br></div><div> </div></div></div></div>