Package: ksplash Version: 4:3.5.5a.dfsg.1-6 Severity: important Tags: patch
ksplash backgrounds itself early on so the startup process in /usr/bin/startkde can continue. ksplash is doing this too early, and it leads to a race condition where if ksplash loses the race, the programs started by startkde will do their work, send a signal to ksplash, and the signal will fail to be used due to ksplash not being ready for it yet. After losing the race ksplash will hang Originaly reported, patched, and verifyed here: https://bugs.launchpad.net/ubuntu/+source/kdebase/+bug/46682 There is also an anti-patch that makes it easier to reproduce the bug. -- System Information: Debian Release: testing/unstable APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.10-5-686 Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Versions of packages ksplash depends on: ii kdebase-data 4:3.5.5a.dfsg.1-6 shared data files for the KDE base ii kdelibs4c2a 4:3.5.5a.dfsg.1-6 core libraries and binaries for al ii libart-2.0-2 2.3.17-1 Library of functions for 2D graphi ii libaudio2 1.7-9 The Network Audio System (NAS). (s ii libc6 2.3.6-15 GNU C Library: Shared libraries ii libfontconfig1 2.4.2-1.2 generic font configuration library ii libfreetype6 2.2.1-2 FreeType 2 font engine, shared lib ii libgcc1 1:4.1.1-21 GCC support library ii libice6 1:1.0.0-3 X11 Inter-Client Exchange library ii libidn11 0.6.3-1 GNU libidn library, implementation ii libjpeg62 6b-13 The Independent JPEG Group's JPEG ii libpng12-0 1.2.15~beta5-1 PNG library - runtime ii libqt3-mt 3:3.3.7-3 Qt GUI Library (Threaded runtime v ii libsm6 1:1.0.0-4 X11 Session Management library ii libstdc++6 4.1.1-21 The GNU Standard C++ Library v3 ii libx11-6 2:1.0.0-7 X11 client-side library ii libxcursor1 1.1.5.2-5 X cursor management library ii libxext6 1:1.0.0-4 X11 miscellaneous extension librar ii libxft2 2.1.8.2-8 FreeType-based font drawing librar ii libxi6 1:1.0.0-5 X11 Input extension library ii libxinerama1 1:1.0.1-4 X11 Xinerama extension library ii libxrandr2 2:1.1.0.2-4 X11 RandR extension library ii libxrender1 1:0.9.0.2-4 X Rendering Extension client libra ii libxt6 1:1.0.0-5 X11 toolkit intrinsics library ii zlib1g 1:1.2.3-12 compression library - runtime ksplash recommends no packages. -- no debconf information
--- startkde.orig 2007-03-03 13:17:24.000000000 -0600 +++ startkde 2007-03-03 14:47:33.041487432 -0600 @@ -304,11 +304,13 @@ ;; # nothing Simple) if test "$kpersonalizerrc_general_firstlogin" = "true"; then - ksplashsimple +# increase the chance that ksplashsimple loses the race to illustrate bug + nice -n 19 ksplashsimple fi # otherwise started earlier ;; *) - ksplash --nodcop +# increase the chance that ksplashsimple loses the race to illustrate bug + nice -n 19 ksplash --nodcop ;; esac @@ -346,7 +348,8 @@ kwrapper kdesktop_lock --forcelock & # Give it some time for starting up. This is somewhat unclean; some # notification would be better. - sleep 1 + # commented out to increase the chance the ksplash loses the race +# sleep 1 fi # finally, give the session control to the session manager
--- kdebase-3.5.5a.dfsg.1/ksplashml/main.cpp 2007-03-03 14:50:34.963831032 -0600 +++ kdebase-3.5.5a.dfsg.1.orig/ksplashml/main.cpp 2005-09-10 03:25:51.000000000 -0500 @@ -54,6 +54,12 @@ KCmdLineArgs::addCmdLineOptions(options); KCmdLineArgs *arg = KCmdLineArgs::parsedArgs(); + if( arg->isSet( "fork" ) ) + { + if (fork()) + exit(0); + } + if ( !( arg->isSet( "dcop" ) ) ) KApplication::disableAutoDcopRegistration(); else if ( KApplication::dcopClient()->attach() ) @@ -69,18 +75,6 @@ wndMain.setStartupItemCount( steps ); } - // The position of this fork() matters, fork too early and you risk the - // calls to KSplash::programStarted being missed. Now that wndMain has - // been instantiated it is safe to do this. An earlier version of - // this program had this fork occuring before the instantiation, - // and this led to a race condition where if ksplash lost the race it would - // hang because it would wait for signals that had already been sent - if( arg->isSet( "fork" ) ) - { - if (fork()) - exit(0); - } - app.setMainWidget(&wndMain); app.setTopWidget(&wndMain); return(app.exec());