[gnutls-devel] [PATCH 3/3] _asn1_ordering_set_of(): Fix memory leak in case of error.
Kurt Roeckx
kurt at roeckx.be
Sat Apr 19 20:13:58 CEST 2014
I need to look at this again, more examples cases of it in the
same file different function. And I might have misunderstood the
intention of the function, so I'm looking at this again.
Kurt
On Sat, Apr 19, 2014 at 07:46:19PM +0200, Kurt Roeckx wrote:
> ---
> lib/minitasn1/coding.c | 17 +++++++++++++----
> 1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/lib/minitasn1/coding.c b/lib/minitasn1/coding.c
> index ef2f96f..5e9864d 100644
> --- a/lib/minitasn1/coding.c
> +++ b/lib/minitasn1/coding.c
> @@ -842,7 +842,7 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
> {
> p_vet = malloc (sizeof (struct vet));
> if (p_vet == NULL)
> - return;
> + goto error;
>
> p_vet->next = NULL;
> p_vet->prev = last;
> @@ -859,12 +859,12 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
> if (asn1_get_tag_der
> (der + counter, der_len - counter, &class, &len,
> NULL) != ASN1_SUCCESS)
> - return;
> + goto error;
> counter += len;
>
> len2 = asn1_get_length_der (der + counter, der_len - counter, &len);
> if (len2 < 0)
> - return;
> + goto error;
> counter += len + len2;
> }
>
> @@ -907,7 +907,7 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
> /* change position */
> temp = malloc (p_vet->end - counter);
> if (temp == NULL)
> - return;
> + goto error;
>
> memcpy (temp, der + counter, (p_vet->end) - counter);
> memcpy (der + counter, der + (p_vet->end),
> @@ -931,6 +931,15 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
> free (p_vet);
> p_vet = first;
> }
> + return;
> +
> +error:
> + while (first != NULL)
> + {
> + p_vet = first;
> + first = first->next;
> + free(p_vet);
> + }
> }
>
> /**
> --
> 1.9.1
>
More information about the Gnutls-devel
mailing list