]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3583. [bug] Address memory leak in GSS-API processing [RT #33574]
authorMark Andrews <marka@isc.org>
Tue, 4 Jun 2013 01:59:57 +0000 (11:59 +1000)
committerMark Andrews <marka@isc.org>
Tue, 4 Jun 2013 02:01:23 +0000 (12:01 +1000)
(cherry picked from commit 2347c72129ce9393578966225f915284f0730214)

CHANGES
lib/dns/gssapictx.c

diff --git a/CHANGES b/CHANGES
index c618e1ccdfb8eaa7b453cfeba03d4a6874ea240d..ea5f05525f598b0f2473320f3fb8d4b7e80b217d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+3583.  [bug]           Address memory leak in GSS-API processing [RT #33574]
+
 3581.  [bug]           Changed the tcp-listen-queue default to 10. [RT #33029]
 
 3580.  [bug]           Addressed a possible race in acache.c [RT #33602]
index e4047d252190577dead4a8c401678c274739bb95..98d49e8ac852d70fb4d97b9e9009b53f98d1a7a2 100644 (file)
@@ -252,12 +252,12 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
                       gss_cred_id_t *cred)
 {
 #ifdef GSSAPI
+       isc_result_t result;
        isc_buffer_t namebuf;
        gss_name_t gname;
        gss_buffer_desc gnamebuf;
        unsigned char array[DNS_NAME_MAXTEXT + 1];
        OM_uint32 gret, minor;
-       gss_OID_set mechs;
        OM_uint32 lifetime;
        gss_cred_usage_t usage;
        char buf[1024];
@@ -304,16 +304,17 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
                usage = GSS_C_ACCEPT;
 
        gret = gss_acquire_cred(&minor, gname, GSS_C_INDEFINITE,
-                               &mech_oid_set,
-                               usage, cred, &mechs, &lifetime);
+                               &mech_oid_set, usage, cred, NULL, &lifetime);
 
        if (gret != GSS_S_COMPLETE) {
                gss_log(3, "failed to acquire %s credentials for %s: %s",
                        initiate ? "initiate" : "accept",
                        (gname != NULL) ? (char *)gnamebuf.value : "?",
                        gss_error_tostring(gret, minor, buf, sizeof(buf)));
-               check_config((char *)array);
-               return (ISC_R_FAILURE);
+               if (gname != NULL)
+                       check_config((char *)array);
+               result = ISC_R_FAILURE;
+               goto cleanup;
        }
 
        gss_log(4, "acquired %s credentials for %s",
@@ -321,8 +322,18 @@ dst_gssapi_acquirecred(dns_name_t *name, isc_boolean_t initiate,
                (gname != NULL) ? (char *)gnamebuf.value : "?");
 
        log_cred(*cred);
+       result = ISC_R_SUCCESS;
+
+cleanup:
+       if (gname != NULL) {
+               gret = gss_release_name(&minor, &gname);
+               if (gret != GSS_S_COMPLETE)
+                       gss_log(3, "failed gss_release_name: %s",
+                               gss_error_tostring(gret, minor, buf,
+                                                  sizeof(buf)));
+       }
 
-       return (ISC_R_SUCCESS);
+       return (result);
 #else
        REQUIRE(cred != NULL && *cred == NULL);
 
@@ -620,7 +631,6 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
                RETERR(isc_buffer_copyregion(outtoken, &r));
                (void)gss_release_buffer(&minor, &gouttoken);
        }
-       (void)gss_release_name(&minor, &gname);
 
        if (gret == GSS_S_COMPLETE)
                result = ISC_R_SUCCESS;
@@ -628,6 +638,7 @@ dst_gssapi_initctx(dns_name_t *name, isc_buffer_t *intoken,
                result = DNS_R_CONTINUE;
 
  out:
+       (void)gss_release_name(&minor, &gname);
        return (result);
 #else
        UNUSED(name);