[libvirt] [PATCH 3/3] virISCSIGetSession: Don't leak memory

John Ferlan jferlan at redhat.com
Wed Apr 5 19:11:52 UTC 2017



On 04/05/2017 04:50 AM, Michal Privoznik wrote:
> This function runs an iscsi command and parses its output.
> However, due to the nature of things, virISCSIExtractSession()
> callback can be called multiple times. In each run it would
> allocate new memory and overwrite the variable where we keep
> pointer to it and thus leaking old allocations.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/util/viriscsi.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/util/viriscsi.c b/src/util/viriscsi.c
> index 504ffbd..9c6fde0 100644
> --- a/src/util/viriscsi.c
> +++ b/src/util/viriscsi.c
> @@ -52,7 +52,8 @@ virISCSIExtractSession(char **const groups,
>  {
>      struct virISCSISessionData *data = opaque;
>  
> -    if (STREQ(groups[1], data->devpath))
> +    if (!data->devpath &&
> +        STREQ(groups[1], data->devpath))
>          return VIR_STRDUP(data->session, groups[0]);
>      return 0;
>  }
> 

I see you fixed your typo "!data->devpath" to "!data->session" before
pushing, but the reality is this is a no-op considering at most we can
only match once, but because virCommandRunRegex only bails if the return
from "*func" is "< 0", we just have to continue through the loop. Not
that it should, but for the purpose of this callback it could.

In any case, we're guaranteed that the "groups[1]" will always be
unique, so all the code does is scan the output looking for the matching
session # and then copy that into data->session. Each session must have
a unique string as that the IQN which must be unique.

As an aside, data->session could change to an int, but that would
require some other changes as well.

John




More information about the libvir-list mailing list