From d5052fd22864ebb879e3b417ecfefd88e6c1800a Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 7 May 2007 19:49:12 +0000 Subject: Upgraded gettext. Fixed accidental dependency on libgcrypt 1.3.0. --- common/ChangeLog | 5 +++++ common/signal.c | 22 +++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) (limited to 'common') diff --git a/common/ChangeLog b/common/ChangeLog index b458bdd5c..797f11962 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -1,3 +1,8 @@ +2007-05-07 Werner Koch + + * signal.c (got_fatal_signal): Protect SIG from being clobbered by + a faulty signal implementaion. Suggested by James Juran. + 2007-04-25 Werner Koch * i18n.h (ngettext): New. diff --git a/common/signal.c b/common/signal.c index 0c79214b2..1c82014e0 100644 --- a/common/signal.c +++ b/common/signal.c @@ -92,9 +92,9 @@ got_fatal_signal (int sig) const char *s; if (caught_fatal_sig) - raise (sig); + raise (sig); caught_fatal_sig = 1; - + if (cleanup_fnc) cleanup_fnc (); /* Better don't translate these messages. */ @@ -109,21 +109,25 @@ got_fatal_signal (int sig) else { /* We are in a signal handler so we can't use any kind of printf - even not sprintf. USe a straightforward algorithm. */ + even not sprintf. So we use a straightforward algorithm. We + got a report that on one particular system, raising a signal + while in this handler, the parameter SIG get sclobbered and + things are messed up because we modify its value. Although + this is a bug in that system, we will protect against it. */ if (sig < 0 || sig >= 100000) write (2, "?", 1); else { - int i, any=0; + int i, value, any=0; - for (i=10000; i; i /= 10) + for (value=sig,i=10000; i; i /= 10) { - if (sig >= i || ((any || i==1) && !(sig/i))) + if (value >= i || ((any || i==1) && !(value/i))) { - write (2, "0123456789"+(sig/i), 1); - if ((sig/i)) + write (2, "0123456789"+(value/i), 1); + if ((value/i)) any = 1; - sig %= i; + value %= i; } } } -- cgit v1.2.3