From: Mark Andrews Date: Thu, 14 Feb 2019 21:52:16 +0000 (+1100) Subject: fix memory leak X-Git-Tag: v9.12.4rc1~12^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea232ab9178059544e815b5a181e28cf06ed8ed0;p=thirdparty%2Fbind9.git fix memory leak (cherry picked from commit 7114d16098b0cf4910e06490fa70758f1c2c62a3) --- diff --git a/lib/dns/spnego_asn1.c b/lib/dns/spnego_asn1.c index 6fbce55b8ff..ec6447b5b49 100644 --- a/lib/dns/spnego_asn1.c +++ b/lib/dns/spnego_asn1.c @@ -466,25 +466,25 @@ decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, siz FORW; { int dce_fix; - if ((dce_fix = fix_dce(reallen, &len)) < 0) - return ASN1_BAD_FORMAT; + if ((dce_fix = fix_dce(reallen, &len)) < 0) { + e = ASN1_BAD_FORMAT; + goto fail; + } { size_t newlen, oldlen; e = der_match_tag(p, len, ASN1_C_CONTEXT, CONS, 0, &l); - if (e) - return e; - else { - p += l; - len -= l; - ret += l; + FORW; + { e = der_get_length(p, len, &newlen, &l); FORW; { int mydce_fix; oldlen = len; - if ((mydce_fix = fix_dce(newlen, &len)) < 0) - return ASN1_BAD_FORMAT; + if ((mydce_fix = fix_dce(newlen, &len)) < 0) { + e = ASN1_BAD_FORMAT; + goto fail; + } e = decode_MechTypeList(p, len, &(data)->mechTypes, &l); FORW; if (mydce_fix) { @@ -510,11 +510,15 @@ decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, siz { int mydce_fix; oldlen = len; - if ((mydce_fix = fix_dce(newlen, &len)) < 0) - return ASN1_BAD_FORMAT; + if ((mydce_fix = fix_dce(newlen, &len)) < 0) { + e = ASN1_BAD_FORMAT; + goto fail; + } (data)->reqFlags = malloc(sizeof(*(data)->reqFlags)); - if ((data)->reqFlags == NULL) - return ENOMEM; + if ((data)->reqFlags == NULL) { + e = ENOMEM; + goto fail; + } e = decode_ContextFlags(p, len, (data)->reqFlags, &l); FORW; if (mydce_fix) { @@ -540,11 +544,15 @@ decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, siz { int mydce_fix; oldlen = len; - if ((mydce_fix = fix_dce(newlen, &len)) < 0) - return ASN1_BAD_FORMAT; + if ((mydce_fix = fix_dce(newlen, &len)) < 0) { + e = ASN1_BAD_FORMAT; + goto fail; + } (data)->mechToken = malloc(sizeof(*(data)->mechToken)); - if ((data)->mechToken == NULL) - return ENOMEM; + if ((data)->mechToken == NULL) { + e = ENOMEM; + goto fail; + } e = decode_octet_string(p, len, (data)->mechToken, &l); FORW; if (mydce_fix) { @@ -570,11 +578,15 @@ decode_NegTokenInit(const unsigned char *p, size_t len, NegTokenInit * data, siz { int mydce_fix; oldlen = len; - if ((mydce_fix = fix_dce(newlen, &len)) < 0) - return ASN1_BAD_FORMAT; + if ((mydce_fix = fix_dce(newlen, &len)) < 0) { + e = ASN1_BAD_FORMAT; + goto fail; + } (data)->mechListMIC = malloc(sizeof(*(data)->mechListMIC)); - if ((data)->mechListMIC == NULL) - return ENOMEM; + if ((data)->mechListMIC == NULL) { + e = ENOMEM; + goto fail; + } e = decode_octet_string(p, len, (data)->mechListMIC, &l); FORW; if (mydce_fix) {