From 9c6c6f495b8469ca5e105f5ddb02a69d1303a106 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Thu, 27 Oct 2011 14:07:09 +0800 Subject: Fix a memory leak in the built-in GnuTLS support. * src/gnutls.c (emacs_gnutls_deinit): New function. Deallocate credentials structures as well as calling gnutls_deinit. (Fgnutls_deinit, Fgnutls_boot): Use it. * src/process.c (make_process): Initialize GnuTLS credentials to NULL. (deactivate_process): Call emacs_gnutls_deinit. --- src/process.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/process.c') diff --git a/src/process.c b/src/process.c index 90ad9c21681..3daa55b259e 100644 --- a/src/process.c +++ b/src/process.c @@ -642,6 +642,8 @@ make_process (Lisp_Object name) p->gnutls_initstage = GNUTLS_STAGE_EMPTY; p->gnutls_log_level = 0; p->gnutls_p = 0; + p->gnutls_x509_cred = NULL; + p->gnutls_anon_cred = NULL; #endif /* If name is already in use, modify it until it is unused. */ @@ -3867,6 +3869,11 @@ deactivate_process (Lisp_Object proc) register int inchannel, outchannel; register struct Lisp_Process *p = XPROCESS (proc); +#ifdef HAVE_GNUTLS + /* Delete GnuTLS structures in PROC, if any. */ + emacs_gnutls_deinit (proc); +#endif /* HAVE_GNUTLS */ + inchannel = p->infd; outchannel = p->outfd; -- cgit v1.2.1 From 435c1d6793ce358f4d2c77c9e9c1ad81fd754651 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Thu, 27 Oct 2011 16:07:28 +0800 Subject: More gnutls memory fixes. * src/gnutls.c (emacs_gnutls_deinit): Deinit the gnutls_state if it is non-NULL, regardless of GNUTLS_INITSTAGE. (Fgnutls_boot): Cleanups. Call emacs_gnutls_deinit if we signal an error. Set process slots as soon as we allocate them. * src/gnutls.h (GNUTLS_LOG, GNUTLS_LOG2): Fix macros. * src/process.c (make_process): Set gnutls_state to NULL. --- src/process.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/process.c') diff --git a/src/process.c b/src/process.c index 3daa55b259e..dc37ec5f961 100644 --- a/src/process.c +++ b/src/process.c @@ -642,6 +642,7 @@ make_process (Lisp_Object name) p->gnutls_initstage = GNUTLS_STAGE_EMPTY; p->gnutls_log_level = 0; p->gnutls_p = 0; + p->gnutls_state = NULL; p->gnutls_x509_cred = NULL; p->gnutls_anon_cred = NULL; #endif -- cgit v1.2.1