]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
fix memory leak
authorMark Andrews <marka@isc.org>
Thu, 14 Feb 2019 21:52:16 +0000 (08:52 +1100)
committerMark Andrews <marka@isc.org>
Mon, 18 Feb 2019 22:37:48 +0000 (09:37 +1100)
(cherry picked from commit 7114d16098b0cf4910e06490fa70758f1c2c62a3)

lib/dns/spnego_asn1.c

index 6fbce55b8ff135f88efbb82b5e46c3235ed42440..ec6447b5b49d5f7da20e4c161ed9c93863323718 100644 (file)
@@ -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) {