Reworked passing of envars to Pinentry.
[gnupg.git] / common / signal.c
index 2837d7b..98859a4 100644 (file)
@@ -6,7 +6,7 @@
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,8 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
  */
 
 #include <config.h>
@@ -91,9 +90,9 @@ got_fatal_signal (int sig)
   const char *s;
 
   if (caught_fatal_sig)
   const char *s;
 
   if (caught_fatal_sig)
-       raise (sig);
+    raise (sig);
   caught_fatal_sig = 1;
   caught_fatal_sig = 1;
-
+  
   if (cleanup_fnc)
     cleanup_fnc ();
   /* Better don't translate these messages. */
   if (cleanup_fnc)
     cleanup_fnc ();
   /* Better don't translate these messages. */
@@ -108,21 +107,25 @@ got_fatal_signal (int sig)
   else
     {
       /* We are in a signal handler so we can't use any kind of printf
   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 
         {
       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;
                     any = 1;
-                  sig %= i;
+                  value %= i;
                 }
             }
         }
                 }
             }
         }
@@ -143,6 +146,7 @@ got_fatal_signal (int sig)
 static RETSIGTYPE
 got_usr_signal (int sig)
 {
 static RETSIGTYPE
 got_usr_signal (int sig)
 {
+  (void)sig;
   caught_sigusr1 = 1;
 }
 #endif /*!HAVE_DOSISH_SYSTEM*/
   caught_sigusr1 = 1;
 }
 #endif /*!HAVE_DOSISH_SYSTEM*/