The following patch, based on the patch submitted at https://bugzilla.redhat.com/show_bug.cgi?id=562143#c2 addresses a file handle leak issue in GDM. After about 6 weeks of operation, it appears that gdm crashes due to code not releasing file handles properly and thus leading to a "too many open files" error message in the log: Sep 20 08:23:24 cgmv1 gdm-binary[31050]: CRITICAL: could not add display to access file: Too many open files Sep 20 08:23:24 cgmv1 gdm-binary[31050]: WARNING: Unable to set up access control for display 1691 Sep 20 08:23:24 cgmv1 gdm-binary[31050]: WARNING: GdmDisplay: display lasted 0.010734 seconds The result is that new clients are unable to connect. The only way to fix the issue otherwise is to re-start gdm, which terminates all active connections. --- gdm-2.30.2.is.2.30.0/daemon/gdm-xdmcp-greeter-display.c.orig 2012-09-20 13:03:50.694403867 +1000 +++ gdm-2.30.2.is.2.30.0/daemon/gdm-xdmcp-greeter-display.c 2012-09-20 13:10:39.866405419 +1000 @@ -59,6 +59,7 @@ static void gdm_xdmcp_greeter_display_class_init (GdmXdmcpGreeterDisplayClass *klass); static void gdm_xdmcp_greeter_display_init (GdmXdmcpGreeterDisplay *xdmcp_greeter_display); static void gdm_xdmcp_greeter_display_finalize (GObject *object); +static gboolean gdm_xdmcp_greeter_display_finish (GdmDisplay *display); G_DEFINE_TYPE (GdmXdmcpGreeterDisplay, gdm_xdmcp_greeter_display, GDM_TYPE_XDMCP_DISPLAY) @@ -66,8 +67,10 @@ gdm_xdmcp_greeter_display_class_init (GdmXdmcpGreeterDisplayClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + GdmDisplayClass *display_class = GDM_DISPLAY_CLASS (klass); object_class->finalize = gdm_xdmcp_greeter_display_finalize; + display_class->finish = gdm_xdmcp_greeter_display_finish; g_type_class_add_private (klass, sizeof (GdmXdmcpGreeterDisplayPrivate)); @@ -118,3 +121,15 @@ return GDM_DISPLAY (object); } + +static gboolean +gdm_xdmcp_greeter_display_finish (GdmDisplay *display) +{ + g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); + + GDM_DISPLAY_CLASS (gdm_xdmcp_greeter_display_parent_class)->finish (display); + + gdm_display_unmanage(display); + + return TRUE; +}