pull up r25115 from trunk
authorTom Yu <tlyu@mit.edu>
Tue, 18 Oct 2011 20:42:52 +0000 (20:42 +0000)
committerTom Yu <tlyu@mit.edu>
Tue, 18 Oct 2011 20:42:52 +0000 (20:42 +0000)
 ------------------------------------------------------------------------
 r25115 | ghudson | 2011-08-26 13:56:44 -0400 (Fri, 26 Aug 2011) | 9 lines

 ticket: 6949

 Remember and close the kadmin socket we opened.

 Prior to ticket #6746, the RPC library opened the kadmin socket and
 took responsibility for closing.  When we added IPv6 support, the
 calling code became the owner of the socket but wasn't closing it,
 resulting in a file descriptor leak.

ticket: 6949
version_fixed: 1.9.2
status: resolved

git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-9@25379 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/kadm5/clnt/client_init.c
src/lib/kadm5/clnt/client_internal.h

index 735ddfd317c008bccfc2900d630a6d69b0c1b7d2..32baf84fd23b7b100105c4d31ec537cc365aa510 100644 (file)
@@ -155,7 +155,7 @@ init_any(krb5_context context, char *client_name, enum init_type init_type,
          kadm5_config_params *params_in, krb5_ui_4 struct_version,
          krb5_ui_4 api_version, char **db_args, void **server_handle)
 {
-    int fd;
+    int fd = -1;
 
     krb5_boolean iprop_enable;
     int port;
@@ -192,6 +192,7 @@ init_any(krb5_context context, char *client_name, enum init_type init_type,
     handle->struct_version = struct_version;
     handle->api_version = api_version;
     handle->clnt = 0;
+    handle->client_socket = -1;
     handle->cache_name = 0;
     handle->destroy_cache = 0;
     handle->context = 0;
@@ -301,7 +302,9 @@ init_any(krb5_context context, char *client_name, enum init_type init_type,
 #endif
         goto error;
     }
+    handle->client_socket = fd;
     handle->lhandle->clnt = handle->clnt;
+    handle->lhandle->client_socket = fd;
 
     /* now that handle->clnt is set, we can check the handle */
     if ((code = _kadm5_check_handle((void *) handle)))
@@ -372,6 +375,8 @@ error:
         AUTH_DESTROY(handle->clnt->cl_auth);
     if(handle->clnt)
         clnt_destroy(handle->clnt);
+    if (fd != -1)
+        close(fd);
 
     kadm5_free_config_params(handle->context, &handle->params);
 
@@ -795,6 +800,8 @@ kadm5_destroy(void *server_handle)
         AUTH_DESTROY(handle->clnt->cl_auth);
     if (handle->clnt)
         clnt_destroy(handle->clnt);
+    if (handle->client_socket != -1)
+        close(handle->client_socket);
     if (handle->lhandle)
         free (handle->lhandle);
 
index c3f8999a6e0d979244060b7d9416b86d631945ba..6ee8eea2331269109d259c716dcd611b3656f39b 100644 (file)
@@ -72,6 +72,7 @@ typedef struct _kadm5_server_handle_t {
     char *          cache_name;
     int             destroy_cache;
     CLIENT *        clnt;
+    int             client_socket;
     krb5_context    context;
     kadm5_config_params params;
     struct _kadm5_server_handle_t *lhandle;