* pinentry/pinentry.c: New variable THIS_PGMNAME.
authorWerner Koch <wk@gnupg.org>
Mon, 22 Dec 2003 10:48:33 +0000 (10:48 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 22 Dec 2003 10:48:33 +0000 (10:48 +0000)
(pinentry_init): Add arg PGMNAME and store it.  Use it at all
marked placed instead of the constant "pinentry".
(usage): Use it here too.
* curses/pinentry-curses.c (main): Call pinentry_init wity our name.
* qt/main.cpp (main): Ditto.
* gtk/pinentry-gtk.c (main): Ditto.

* configure.ac: Check for mmap.

* secmem/util.h (wipememory2,wipememory,wipe): New.
* secmem/util.c (wipe): Removed.
* secmem/util.c (lower_privs, raise_privs): Commented out.

* pinentry/pinentry.c (pinentry_loop): Add paranoia check for
dropped privs.

* secmem/secmem.c (lock_pool): Cleanup syntax of cpp directives.

* gtk/pinentry-gtk.c (main): Print package name in the version line.
* curses/pinentry-curses.c (main): Ditto.
* qt/main.cpp (main): Ditto. Fixed typo.

* gtk/pinentry-gtk.c: Include memory.h.

12 files changed:
AUTHORS
ChangeLog
NEWS
configure.ac
curses/pinentry-curses.c
gtk/pinentry-gtk.c
pinentry/pinentry.c
pinentry/pinentry.h
qt/main.cpp
secmem/secmem.c
secmem/util.c
secmem/util.h

diff --git a/AUTHORS b/AUTHORS
index 12b0d65..6906a98 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1,8 @@
+Program: Pinentry
+Bug reports: <gp-dev@gnupg.org>
+Security related bug reports: <security@gnupg.org>
+
+
 Robert Bihlmeyer <robbe@orcus.priv.at>
 Werner Koch, g10 Code GmbH <wk@gnupg.org>
 Steffen Hansen, Klarälvdalens Datakonsult AB <steffen@klaralvdalens-datakonsult.se>
index c379aac..76695fc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2003-12-22  Werner Koch  <wk@gnupg.org>
+
+       * pinentry/pinentry.c: New variable THIS_PGMNAME.
+       (pinentry_init): Add arg PGMNAME and store it.  Use it at all
+       marked placed instead of the constant "pinentry".
+       (usage): Use it here too.
+       * curses/pinentry-curses.c (main): Call pinentry_init wity our name. 
+       * qt/main.cpp (main): Ditto.
+       * gtk/pinentry-gtk.c (main): Ditto. 
+
+       * configure.ac: Check for mmap.
+
+       * secmem/util.h (wipememory2,wipememory,wipe): New.
+       * secmem/util.c (wipe): Removed.
+       * secmem/util.c (lower_privs, raise_privs): Commented out.
+
+       * pinentry/pinentry.c (pinentry_loop): Add paranoia check for
+       dropped privs.
+
+       * secmem/secmem.c (lock_pool): Cleanup syntax of cpp directives.
+
+       * gtk/pinentry-gtk.c (main): Print package name in the version line.
+       * curses/pinentry-curses.c (main): Ditto.
+       * qt/main.cpp (main): Ditto. Fixed typo.
+
+       * gtk/pinentry-gtk.c: Include memory.h.
+       
 2003-12-20  Marcus Brinkmann  <marcus@g10code.de>
 
        * pinentry/pinentry.h (struct pinentry): New member PARENT_WID.
diff --git a/NEWS b/NEWS
index 0f125e4..1bf6907 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,7 +11,7 @@ Noteworthy changes in version 0.7.0 (unreleased)
  * Fixed a bug that would occur if a canceled GETPIN was immediately
    followed by a CONFIRM.
 
- * Disable undo/redo in Qt pinentry.
+ * Disabled undo/redo in Qt pinentry.
 
 
 Noteworthy changes in version 0.6.8 (2003-02-07)
index 2bb5985..6635c2e 100644 (file)
@@ -56,7 +56,7 @@ if test "$GCC" = yes; then
 fi
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS(seteuid stpcpy)
+AC_CHECK_FUNCS(seteuid stpcpy mmap)
 GNUPG_CHECK_MLOCK
 
 dnl Checks for libassuan.
index 182dbed..823206e 100644 (file)
@@ -34,12 +34,12 @@ pinentry_cmd_handler_t pinentry_cmd_handler = curses_cmd_handler;
 int 
 main (int argc, char *argv[])
 {
-  pinentry_init ();
+  pinentry_init ("pinentry-curses");
 
   /* Consumes all arguments.  */
   if (pinentry_parse_opts (argc, argv))
     {
-      printf ("pinentry-curses " VERSION "\n");
+      printf ("pinentry-curses (pinentry) " VERSION "\n");
       exit (EXIT_SUCCESS);
     }
 
index 1d63f5f..5213920 100644 (file)
@@ -39,6 +39,8 @@
 
 #include "gtksecentry.h"
 #include "pinentry.h"
+#include "memory.h"
+
 
 #ifdef FALLBACK_CURSES
 #include "pinentry-curses.h"
@@ -383,7 +385,7 @@ pinentry_cmd_handler_t pinentry_cmd_handler = gtk_cmd_handler;
 int 
 main (int argc, char *argv[])
 {
-  pinentry_init ();
+  pinentry_init (PGMNAME);
 
 #ifdef FALLBACK_CURSES
   if (pinentry_have_display (argc, argv))
@@ -397,7 +399,7 @@ main (int argc, char *argv[])
   /* Consumes all arguments.  */
   if (pinentry_parse_opts (argc, argv))
     {
-      printf ("pinentry-gtk " VERSION "\n");
+      printf ("pinentry-gtk (pinentry) " VERSION "\n");
       exit (EXIT_SUCCESS);
     }
 
index ebeddbf..20cbbd1 100644 (file)
@@ -1,5 +1,5 @@
 /* pinentry.c - The PIN entry support library
-   Copyright (C) 2002 g10 Code GmbH
+   Copyright (C) 2002, 2003 g10 Code GmbH
    
    This file is part of PINENTRY.
    
 #include "pinentry.h"
 
 
+/* Keep the name of our program here. */
+static char this_pgmname[50]; 
+
+
 struct pinentry pinentry =
   {
     NULL,      /* Description.  */
@@ -185,11 +189,16 @@ pinentry_setbufferlen (pinentry_t pin, int len)
 }
 
 
-/* Initialize the secure memory subsystem, drop privileges and
-   return.  Must be called early.  */
+/* Initialize the secure memory subsystem, drop privileges and return.
+   Must be called early. */
 void
-pinentry_init (void)
+pinentry_init (const char *pgmname)
 {
+  /* Store away our name. */
+  if (strlen (pgmname) > sizeof this_pgmname - 2)
+    abort ();
+  strcpy (this_pgmname, pgmname);
+
   /* Initialize secure memory.  1 is too small, so the default size
      will be used.  */
   secmem_init (1);
@@ -236,7 +245,7 @@ Ask securely for a secret and print it to stdout.\n\
       --parent-wid     Parent window ID (for positioning)\n\
   -d, --debug           Turn on debugging output\n\
       --help            Display this help and exit\n\
-      --version         Output version information and exit\n", "?");
+      --version         Output version information and exit\n", this_pgmname);
 }
 
 
@@ -274,8 +283,7 @@ pinentry_parse_opts (int argc, char *argv[])
          pinentry.display = strdup (optarg);
          if (!pinentry.display)
            {
-             /* XXX Program name.  */
-             fprintf (stderr, "pinentry: %s\n", strerror (errno));
+             fprintf (stderr, "%s: %s\n", this_pgmname, strerror (errno));
              exit (EXIT_FAILURE);
            }
          break;
@@ -283,8 +291,7 @@ pinentry_parse_opts (int argc, char *argv[])
          pinentry.ttyname = strdup (optarg);
          if (!pinentry.ttyname)
            {
-             /* XXX Program name.  */
-             fprintf (stderr, "pinentry: %s\n", strerror (errno));
+             fprintf (stderr, "%s: %s\n", this_pgmname, strerror (errno));
              exit (EXIT_FAILURE);
            }
          break;
@@ -292,8 +299,7 @@ pinentry_parse_opts (int argc, char *argv[])
          pinentry.ttytype = strdup (optarg);
          if (!pinentry.ttytype)
            {
-             /* XXX Program name.  */
-             fprintf (stderr, "pinentry: %s\n", strerror (errno));
+             fprintf (stderr, "%s: %s\n", this_pgmname, strerror (errno));
              exit (EXIT_FAILURE);
            }
          break;
@@ -301,8 +307,7 @@ pinentry_parse_opts (int argc, char *argv[])
          pinentry.lc_ctype = strdup (optarg);
          if (!pinentry.lc_ctype)
            {
-             /* XXX Program name.  */
-             fprintf (stderr, "pinentry: %s\n", strerror (errno));
+             fprintf (stderr, "%s: %s\n", this_pgmname, strerror (errno));
              exit (EXIT_FAILURE);
            }
          break;
@@ -310,8 +315,7 @@ pinentry_parse_opts (int argc, char *argv[])
          pinentry.lc_messages = strdup (optarg);
          if (!pinentry.lc_messages)
            {
-             /* XXX Program name.  */
-             fprintf (stderr, "pinentry: %s\n", strerror (errno));
+             fprintf (stderr, "%s: %s\n", this_pgmname, strerror (errno));
              exit (EXIT_FAILURE);
            }
          break;
@@ -344,11 +348,10 @@ option_handler (ASSUAN_CONTEXT ctx, const char *key, const char *value)
     pinentry.grab = 1;
   else if (!strcmp (key, "debug-wait"))
     {
-      /* XXX Program name.  */
-      fprintf (stderr, "pinentry: waiting for debugger - my pid is %u ...\n",
-              (unsigned int) getpid());
+      fprintf (stderr, "%s: waiting for debugger - my pid is %u ...\n",
+              this_pgmname, (unsigned int) getpid());
       sleep (*value?atoi (value):5);
-      fprintf (stderr, "pinentry: ... okay\n");
+      fprintf (stderr, "%s: ... okay\n", this_pgmname);
     }
   else if (!strcmp (key, "display"))
     {
@@ -618,6 +621,10 @@ pinentry_loop (void)
   int filedes[2];
   ASSUAN_CONTEXT ctx;
 
+  /* Extra check to make sure we have dropped privs. */
+  if (getuid() != geteuid())
+    abort ();
+
   /* For now we use a simple pipe based server so that we can work
      from scripts.  We will later add options to run as a daemon and
      wait for requests on a Unix domain socket.  */
@@ -626,16 +633,15 @@ pinentry_loop (void)
   rc = assuan_init_pipe_server (&ctx, filedes);
   if (rc)
     {
-      /* XXX Program name.  */
-      fprintf (stderr, "pinentry: failed to initialize the server: %s\n",
-               assuan_strerror(rc));
+      fprintf (stderr, "%s: failed to initialize the server: %s\n",
+               this_pgmname, assuan_strerror(rc));
       return -1;
     }
   rc = register_commands (ctx);
   if (rc)
     {
-      fprintf (stderr, "pinentry: failed to the register commands with Assuan: %s\n",
-               assuan_strerror(rc));
+      fprintf (stderr, "%s: failed to the register commands with Assuan: %s\n",
+               this_pgmname, assuan_strerror(rc));
       return -1;
     }
 
@@ -651,17 +657,16 @@ pinentry_loop (void)
           break;
       else if (rc)
         {
-         /* XXX Program name.  */
-          fprintf (stderr, "pinentry: Assuan accept problem: %s\n",
-                   assuan_strerror (rc));
+          fprintf (stderr, "%s: Assuan accept problem: %s\n",
+                   this_pgmname, assuan_strerror (rc));
           break;
         }
       
       rc = assuan_process (ctx);
       if (rc)
         {
-          fprintf (stderr, "pinentry: Assuan processing failed: %s\n",
-                   assuan_strerror (rc));
+          fprintf (stderr, "%s: Assuan processing failed: %s\n",
+                   this_pgmname, assuan_strerror (rc));
           continue;
         }
     }
index 9494a6a..9a44268 100644 (file)
@@ -99,7 +99,7 @@ char *pinentry_setbufferlen (pinentry_t pin, int len);
 
 /* Initialize the secure memory subsystem, drop privileges and
    return.  Must be called early.  */
-void pinentry_init (void);
+void pinentry_init (const char *pgmname);
 
 /* Return true if either DISPLAY is set or ARGV contains the string
    "--display". */
index ec8fed7..8eefbd5 100644 (file)
@@ -119,7 +119,7 @@ pinentry_cmd_handler_t pinentry_cmd_handler = qt_cmd_handler;
 int 
 main (int argc, char *argv[])
 {
-  pinentry_init ();
+  pinentry_init ("pinentry-qt");
 
 #ifdef FALLBACK_CURSES
   if (!pinentry_have_display (argc, argv))
@@ -134,7 +134,7 @@ main (int argc, char *argv[])
   /* Consumes all arguments.  */
   if (pinentry_parse_opts (argc, argv))
     {
-      printf ("pinentry-gtk " VERSION "\n");
+      printf ("pinentry-qt (pinentry) " VERSION "\n");
       exit (EXIT_SUCCESS);
     }
 
index 733b396..577a0a6 100644 (file)
@@ -1,5 +1,5 @@
 /* secmem.c  - memory allocation from a secure heap
- *     Copyright (C) 1998,1999 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include <stdarg.h>
 #include <unistd.h>
 #if defined(HAVE_MLOCK) || defined(HAVE_MMAP)
-  #include <sys/mman.h>
-  #include <sys/types.h>
-  #include <fcntl.h>
-  #ifdef USE_CAPABILITIES
-    #include <sys/capability.h>
-  #endif
+include <sys/mman.h>
+include <sys/types.h>
+include <fcntl.h>
+ifdef USE_CAPABILITIES
+#  include <sys/capability.h>
+endif
 #endif
 #include <string.h>
 
@@ -48,9 +48,9 @@ typedef union {
     short b;
     char c[1];
     long d;
-  #ifdef HAVE_U64_TYPEDEF
+#ifdef HAVE_U64_TYPEDEF
     u64 e;
-  #endif
+#endif
     float f;
     double g;
 } PROPERLY_ALIGNED_TYPE;
@@ -58,7 +58,8 @@ typedef union {
 #define log_error log_info
 #define log_bug log_fatal
 
-void log_info(char *template, ...)
+void 
+log_info(char *template, ...)
 {
   va_list args;
   
@@ -67,7 +68,8 @@ void log_info(char *template, ...)
   va_end(args);
 }
 
-void log_fatal(char *template, ...)
+void 
+log_fatal(char *template, ...)
 {
   va_list args;
   
@@ -80,7 +82,7 @@ void log_fatal(char *template, ...)
 #endif /* ORIGINAL_GPG_VERSION */
 
 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
-  #define MAP_ANONYMOUS MAP_ANON
+#  define MAP_ANONYMOUS MAP_ANON
 #endif
 
 #define DEFAULT_POOLSIZE 16384
@@ -123,7 +125,7 @@ print_warn(void)
 static void
 lock_pool( void *p, size_t n )
 {
-  #if defined(USE_CAPABILITIES) && defined(HAVE_MLOCK)
+#if defined(USE_CAPABILITIES) && defined(HAVE_MLOCK)
     int err;
 
     cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
@@ -142,13 +144,13 @@ lock_pool( void *p, size_t n )
        show_warning = 1;
     }
 
-  #elif defined(HAVE_MLOCK)
+#elif defined(HAVE_MLOCK)
     uid_t uid;
     int err;
 
     uid = getuid();
 
-  #ifdef HAVE_BROKEN_MLOCK
+#ifdef HAVE_BROKEN_MLOCK
     if( uid ) {
        errno = EPERM;
        err = errno;
@@ -158,11 +160,11 @@ lock_pool( void *p, size_t n )
        if( err && errno )
            err = errno;
     }
-  #else
+#else
     err = mlock( p, n );
     if( err && errno )
        err = errno;
-  #endif
+#endif
 
     if( uid && !geteuid() ) {
        if( setuid( uid ) || getuid() != geteuid()  )
@@ -171,17 +173,17 @@ lock_pool( void *p, size_t n )
 
     if( err ) {
        if( errno != EPERM
-         #ifdef EAGAIN  /* OpenBSD returns this */
+#ifdef EAGAIN  /* OpenBSD returns this */
            && errno != EAGAIN
-         #endif
+#endif
          )
            log_error("can´t lock memory: %s\n", strerror(err));
        show_warning = 1;
     }
 
-  #else
+#else
     log_info("Please note that you don't have secure memory on this system\n");
-  #endif
+#endif
 }
 
 
@@ -195,18 +197,18 @@ init_pool( size_t n)
     if( disable_secmem )
        log_bug("secure memory is disabled");
 
-  #ifdef HAVE_GETPAGESIZE
+#ifdef HAVE_GETPAGESIZE
     pgsize = getpagesize();
-  #else
+#else
     pgsize = 4096;
-  #endif
+#endif
 
-  #if HAVE_MMAP
+#if HAVE_MMAP
     poolsize = (poolsize + pgsize -1 ) & ~(pgsize-1);
-    #ifdef MAP_ANONYMOUS
+ifdef MAP_ANONYMOUS
        pool = mmap( 0, poolsize, PROT_READ|PROT_WRITE,
                                 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
-    #else /* map /dev/zero instead */
+else /* map /dev/zero instead */
     {  int fd;
 
        fd = open("/dev/zero", O_RDWR);
@@ -219,7 +221,7 @@ init_pool( size_t n)
                                      MAP_PRIVATE, fd, 0);
        }
     }
-    #endif
+endif
     if( pool == (void*)-1 )
        log_info("can't mmap pool of %u bytes: %s - using malloc\n",
                            (unsigned)poolsize, strerror(errno));
@@ -228,7 +230,7 @@ init_pool( size_t n)
        pool_okay = 1;
     }
 
-  #endif
+#endif
     if( !pool_okay ) {
        pool = malloc( poolsize );
        if( !pool )
@@ -420,10 +422,10 @@ secmem_term()
     memset( pool, 0xaa, poolsize);
     memset( pool, 0x55, poolsize);
     memset( pool, 0x00, poolsize);
-  #if HAVE_MMAP
+#if HAVE_MMAP
     if( pool_is_mmapped )
        munmap( pool, poolsize );
-  #endif
+#endif
     pool = NULL;
     pool_okay = 0;
     poolsize=0;
index 58d70b1..d06f834 100644 (file)
@@ -77,14 +77,6 @@ int debugmsg(const char *fmt, ...)
 }
 #endif
 
-/* wipe out a block of N bytes starting at address PTR */
-void wipe(void *ptr, size_t n)
-{
-  /* you may want to overwrite with several different bit patterns, depending
-     on your belief system. */
-  memset(ptr, n, 0);
-}
-
 /* initialize uid variables */
 static void init_uids(void)
 {
@@ -93,6 +85,8 @@ static void init_uids(void)
   uid_set = 1;
 }
 
+
+#if 0 /* Not used. */
 /* lower privileges to the real user's */
 void lower_privs()
 {
@@ -109,17 +103,20 @@ void lower_privs()
 #endif /* HAVE_SETEUID */
   }
 }
+#endif /* if 0 */
 
+#if 0 /* Not used. */
 /* raise privileges to the effective user's */
 void raise_privs()
 {
   assert(real_uid >= 0);       /* lower_privs() must be called before this */
 #ifdef HAVE_SETEUID
   if (real_uid != file_uid && seteuid(file_uid) < 0) {
-    perror("Warning: raising privileges failed");
+   perror("Warning: raising privileges failed");
   }
 #endif /* HAVE_SETEUID */
 }
+#endif /* if 0 */
 
 /* drop all additional privileges */
 void drop_privs()
index 57bde51..7986c99 100644 (file)
@@ -1,5 +1,6 @@
 /* Quintuple Agent utilities
  * Copyright (C) 1999 Robert Bihlmeyer <robbe@orcus.priv.at>
+ * Copyright (C) 2003 g10 Code GmbH
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 
 ssize_t xwrite(int, const void *, size_t); /* write until finished */
 int debugmsg(const char *, ...); /* output a debug message if debugging==on */
-void wipe(void *, size_t);     /* wipe a block of memory */
-void lower_privs(void);                /* lower privileges */
-void raise_privs(void);                /* raise privileges again */
 void drop_privs(void);         /* finally drop privileges */
 
 
+/* To avoid that a compiler optimizes certain memset calls away, these
+   macros may be used instead. */
+#define wipememory2(_ptr,_set,_len) do { \
+              volatile char *_vptr=(volatile char *)(_ptr); \
+              size_t _vlen=(_len); \
+              while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
+                  } while(0)
+#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
+#define wipe(_ptr,_len)       wipememory2(_ptr,0,_len)
+
+
+
+
 #define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
                      *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
 #define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))