[krbdev.mit.edu #6844] Memory leak in save_error_string_nocopy()

Tim Pozdeev via RT rt-comment at krbdev.mit.edu
Tue Dec 14 22:32:38 EST 2010


krb5 version 1.8.3. It also applies to version 1.7.x.

There is a memory leak in save_error_string_nocopy() in disp_status.c.

Using umem and gcore leak detection under Solaris highlights the
following leak.

umem_alloc_16 leak: 84 buffers, 16 bytes each, 1344 bytes total
            ADDR          BUFADDR        TIMESTAMP           THREAD
                            CACHE          LASTLOG         CONTENTS
         592b7e0          5929750   1b4ec693e03bcb              172
                          226a028          221ac00                0
                 libumem.so.1`umem_cache_alloc_debug+0x12b
                 libumem.so.1`umem_cache_alloc+0xc8
                 libumem.so.1`umem_alloc+0xaf
                 libumem.so.1`malloc+0x2e
                 libgssapi_krb5.so.2`gss_krb5_save_error_string_nocopy
+0x2e
                 libgssapi_krb5.so.2`krb5_gss_save_error_string+0x2f
                 libgssapi_krb5.so.2`krb5_gss_save_error_info+0x2b
                 libgssapi_krb5.so.2`krb5_gss_validate_cred+0x6e
                 libgssapi_krb5.so.2`krb5_gss_init_sec_context+0x175
                 libgssapi_krb5.so.2`gss_init_sec_context+0x27c

The memory allocated on line 81 (in disp_status.c) never gets freed.

79:    p = k5_getspecific(K5_KEY_GSS_KRB5_ERROR_MESSAGE);
80:    if (!p) {
81:        p = malloc(sizeof(*p));   <<<--- here
82:        if (p == NULL) {
83:            ret = 1;


The fix is to free the memory in krb5_gss_delete_error_info():

--- disp_status.c       Tue Dec  8 11:04:48 2009
+++ disp_status.c-fixed Wed Dec 15 12:00:12 2010
@@ -148,6 +148,7 @@
 void krb5_gss_delete_error_info(void *p)
 {
     gsserrmap_destroy(p);
+    free(p);
 }
 
 /**/

Tim





More information about the krb5-bugs mailing list