[PATCH] os: Prevent core dump from being truncated.

Rami Ylimaki ext-rami.ylimaki at nokia.com
Tue Jan 12 01:47:47 PST 2010


The problem fixed by this patch can be reproduced on Linux with the
following steps.
- Access NULL pointer intentionally in ProcessOtherEvent on key press.
- Instead of saving core dump to a file, write it into a pipe.
  echo "|/usr/sbin/my-core-dumper" > /proc/sys/kernel/core_pattern
- Dump the core by pressing a key.

While the core is being dumped into the pipe, the smart schedule timer
will cause a pending SIGALRM. Linux kernel stops writing data to the
pipe when there are pending signals. This causes the core dump to be
truncated. On my system I'm expecting a 6 MB dump but the size will be
60 kB instead. The problem is solved if we prevent the smart schedule
timer from expiring before aborting.

I haven't been able to reproduce this problem in the following cases.
- Save core dump to a file instead of a pipe.
- kill -SEGV `pidof Xorg`
- Press a key to dump core while gdb is attached to Xorg.
- Give option -dumbSched to Xorg.

Also note that the fix works only when NoTrapSignals has the default
value FALSE. The problem can still be reproduced if error signals
aren't trapped. In addition to pending SIGALRM, there is a similar
problem with pending SIGIO from the keyboard driver during core dump.

Signed-off-by: Rami Ylimaki <ext-rami.ylimaki at nokia.com>
---
 os/osinit.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/os/osinit.c b/os/osinit.c
index 74e2457..9a9e4e4 100644
--- a/os/osinit.c
+++ b/os/osinit.c
@@ -208,5 +208,6 @@ OsCleanup(Bool terminating)
     if (terminating)
     {
 	UnlockServer();
+	SmartScheduleStopTimer();
     }
 }
-- 
1.6.0.4



More information about the xorg-devel mailing list