[xinetd/f16] Fix leaking file descriptors Resolves: #702670

jsynacek jsynacek at fedoraproject.org
Thu Jan 19 08:50:43 UTC 2012


commit 732b66c35543ad98da6da1a11ce7b6ec9663b8f6
Author: Jan Synacek <jsynacek at redhat.com>
Date:   Mon Jan 16 08:36:22 2012 +0100

    Fix leaking file descriptors
    Resolves: #702670

 xinetd-2.3.14-leaking-fds.patch |   52 +++++++++++++++++++++++++++++++++++++++
 xinetd.spec                     |   10 ++++++-
 2 files changed, 61 insertions(+), 1 deletions(-)
---
diff --git a/xinetd-2.3.14-leaking-fds.patch b/xinetd-2.3.14-leaking-fds.patch
new file mode 100644
index 0000000..bc1b919
--- /dev/null
+++ b/xinetd-2.3.14-leaking-fds.patch
@@ -0,0 +1,52 @@
+diff -up xinetd-2.3.14-dist/xinetd/service.c xinetd-2.3.14/xinetd/service.c
+--- xinetd-2.3.14-dist/xinetd/service.c	2012-01-11 11:50:43.438650900 +0100
++++ xinetd-2.3.14/xinetd/service.c	2012-01-16 08:18:09.462620084 +0100
+@@ -88,6 +88,7 @@ struct service *svc_new( struct service_
+    CLEAR( *sp ) ;
+ 
+    SVC_CONF(sp) = scp ;
++   sp->svc_pfd_index = -1;
+    return( sp ) ;
+ }
+ 
+@@ -346,7 +347,16 @@ status_e svc_activate( struct service *s
+        ps.rws.pfds_last)*sizeof(struct pollfd));
+      ps.rws.pfd_array = tmp;
+    }
+-   SVC_POLLFD( sp ) = &ps.rws.pfd_array[ps.rws.pfds_last++] ;
++   if ( sp->svc_pfd_index >= 0 )
++   {
++     SVC_POLLFD( sp ) = &ps.rws.pfd_array[sp->svc_pfd_index] ;
++   }
++   else
++   {
++     sp->svc_pfd_index = ps.rws.pfds_last ;
++     SVC_POLLFD( sp ) = &ps.rws.pfd_array[ps.rws.pfds_last++] ;
++   }
++
+ #endif /* HAVE_POLL */
+ 
+    if( SC_IPV4( scp ) ) {
+@@ -433,6 +443,11 @@ status_e svc_activate( struct service *s
+ static void deactivate( const struct service *sp )
+ {
+    (void) Sclose( SVC_FD( sp ) ) ;
++#ifdef HAVE_POLL
++   SVC_FD( sp ) = 0;
++#else      
++   FD_CLR( SVC_FD( sp ), &ps.rws.socket_mask ) ;
++#endif
+ 
+ #ifdef HAVE_MDNS
+    xinetd_mdns_deregister(SVC_CONF(sp));
+diff -up xinetd-2.3.14-dist/xinetd/service.h xinetd-2.3.14/xinetd/service.h
+--- xinetd-2.3.14-dist/xinetd/service.h	2012-01-11 11:50:43.418650925 +0100
++++ xinetd-2.3.14/xinetd/service.h	2012-01-16 08:02:59.667553008 +0100
+@@ -47,6 +47,7 @@ struct service
+ {
+    state_e                svc_state ;
+    int                    svc_ref_count ;   /* # of pters to this struct */
++   int                    svc_pfd_index;    /* index of pfd in pfd_array */
+    struct service_config *svc_conf ;    /* service configuration */
+ 
+ #ifdef HAVE_POLL
diff --git a/xinetd.spec b/xinetd.spec
index 8d6f076..ca07944 100644
--- a/xinetd.spec
+++ b/xinetd.spec
@@ -1,7 +1,7 @@
 Summary: A secure replacement for inetd
 Name: xinetd
 Version: 2.3.14
-Release: 37%{?dist}
+Release: 38%{?dist}
 License: xinetd 
 Group: System Environment/Daemons
 Epoch: 2
@@ -43,6 +43,9 @@ Patch17: xinetd-2.3.13-log-crash.patch
 Patch18: xinetd-2.3.14-rpc-specific-port.patch
 Patch19: xinetd-2.3.14-signal-log-hang.patch
 Patch20: xinetd-2.3.14-fix-type-punned-ptr.patch
+# Fix leaking file descriptors and pfd_array wasting
+# This fixes #702670
+Patch21: xinetd-2.3.14-leaking-fds.patch
 
 BuildRequires: autoconf, automake
 BuildRequires: libselinux-devel >= 1.30
@@ -95,6 +98,7 @@ located in the /etc/xinetd.d directory.
 %patch18 -p1 -b .rpc-specific-port
 %patch19 -p1 -b .signal-log-hang
 %patch20 -p1 -b .fix-type-punned-ptr
+%patch21 -p1 -b .leaking-fds
 
 aclocal
 autoconf
@@ -164,6 +168,10 @@ fi
 %{_mandir}/*/*
 
 %changelog
+* Mon Jan 16 2012 Jan Synáček <jsynacek at redhat.com> - 2:2.3.14-38
+- Fix leaking file descriptors
+- Resolves: #702670
+
 * Mon Sep 12 2011 Tom Callaway <spot at fedoraproject.org> - 2:2.3.14-37
 - covert to systemd
 


More information about the scm-commits mailing list