g10: Fix opening of trust database.
authorJustus Winter <justus@g10code.com>
Wed, 10 Aug 2016 14:41:22 +0000 (16:41 +0200)
committerJustus Winter <justus@g10code.com>
Wed, 10 Aug 2016 14:50:29 +0000 (16:50 +0200)
* g10/tdbio.c (tdbio_set_dbname): This function explicitly checks for
the file size, but handled the case of a zero-sized file incorrectly
by returning success.  Fix this by initializing the database in that
case.
* tests/openpgp/Makefile.am (XTESTS): Add new test.
* tests/openpgp/issue2417.scm: New file.

GnuPG-bug-id: 2417
Signed-off-by: Justus Winter <justus@g10code.com>
g10/tdbio.c
tests/openpgp/Makefile.am
tests/openpgp/issue2417.scm [new file with mode: 0755]

index e27788e..02fa91e 100644 (file)
@@ -685,7 +685,7 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
 
   take_write_lock ();
 
-  if (access (fname, R_OK))
+  if (access (fname, R_OK) || stat (fname, &statbuf) || statbuf.st_size == 0)
     {
       FILE *fp;
       TRUSTREC rec;
@@ -699,7 +699,7 @@ tdbio_set_dbname (const char *new_dbname, int create, int *r_nofile)
       else
         gpg_err_set_errno (EIO);
 #endif /*HAVE_W32CE_SYSTEM*/
-      if (errno != ENOENT)
+      if (errno && errno != ENOENT)
         log_fatal ( _("can't access '%s': %s\n"), fname, strerror (errno));
 
       oldmask = umask (077);
index da12cae..5d8acbf 100644 (file)
@@ -84,6 +84,7 @@ XTESTS = \
        ssh.scm \
        issue2015.scm \
        issue2346.scm \
+       issue2417.scm \
        issue2419.scm
 
 # XXX: Currently, one cannot override automake's 'check' target.  As a
diff --git a/tests/openpgp/issue2417.scm b/tests/openpgp/issue2417.scm
new file mode 100755 (executable)
index 0000000..32840f2
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/env gpgscm
+
+;; Copyright (C) 2016 g10 Code GmbH
+;;
+;; This file is part of GnuPG.
+;;
+;; 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 3 of the License, or
+;; (at your option) any later version.
+;;
+;; GnuPG is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; 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, see <http://www.gnu.org/licenses/>.
+
+(load (with-path "defs.scm"))
+
+(define (touch file-name)
+  (close (open file-name (logior O_WRONLY O_BINARY O_CREAT) #o600)))
+
+(info "Checking robustness wrt empty databases in gnupghome (issue2417)...")
+
+(lettmp
+ ;; Prepare some random key to import later.
+ (keyfile)
+ (pipe:do
+  (pipe:gpg '(--export alpha))
+  (pipe:write-to keyfile (logior O_WRONLY O_BINARY O_CREAT) #o600))
+
+ (with-temporary-working-directory
+  (setenv "GNUPGHOME" "." #t)
+  (touch "trustdb.gpg")
+  (touch "pubring.gpg")
+  (touch "pubring.kbx")
+  (call-check `(,(tool 'GPG) --import ,keyfile))))