From 89f8f4e0a5b2aa091a5a63b67a97ef4089ae466c Mon Sep 17 00:00:00 2001 From: JinWang An Date: Wed, 1 Dec 2021 16:54:35 +0900 Subject: Imported Upstream version 1.5.2 --- src/Makefile.am | 10 +++-- src/Makefile.in | 116 ++++++++++++++++++++++++++++++++++++++----------------- src/debug.h | 4 +- src/engine-gpg.c | 57 +++++++++++++++++++++------ src/gpgme-tool.c | 21 ++++++---- src/gpgme.m4 | 59 ++++++++++++++++++++++++---- src/sign.c | 104 ++++++++++++++++++++++++++++++++++--------------- 7 files changed, 272 insertions(+), 99 deletions(-) (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 82f5327..b7ddbc1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,7 +18,7 @@ ## Process this file with automake to produce Makefile.in -# Note: moc_kdpipeiodevice should actually be a dependcy below. +# Note: moc_kdpipeiodevice should actually be a dependecy below. EXTRA_DIST = gpgme-config.in gpgme.m4 libgpgme.vers ChangeLog-2011 \ gpgme.h.in versioninfo.rc.in gpgme.def moc_kdpipeiodevice.cpp @@ -27,6 +27,8 @@ m4datadir = $(datadir)/aclocal m4data_DATA = gpgme.m4 nodist_include_HEADERS = gpgme.h +bin_PROGRAMS = gpgme-tool + if HAVE_PTHREAD ltlib_gpgme_pthread = libgpgme-pthread.la else @@ -126,6 +128,9 @@ endif AM_CPPFLAGS = @GPG_ERROR_CFLAGS@ @QT4_CORE_CFLAGS@ AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@ @QT4_CORE_CFLAGS@ +gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ + + if HAVE_W32_SYSTEM # Windows provides us with an endless stream of Tough Love. To spawn # processes with a controlled set of inherited handles, we need a @@ -201,9 +206,6 @@ libgpgme_qt_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \ @GPG_ERROR_LIBS@ @QT4_CORE_LIBS@ endif -noinst_PROGRAMS = gpgme-tool -gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ - install-data-local: install-def-file uninstall-local: uninstall-def-file diff --git a/src/Makefile.in b/src/Makefile.in index cd55a3f..bd5f999 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -73,9 +73,9 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ +bin_PROGRAMS = gpgme-tool$(EXEEXT) @HAVE_W32CE_SYSTEM_TRUE@am__append_1 = w32-ce.h w32-ce.c @HAVE_W32CE_SYSTEM_FALSE@@HAVE_W32_SYSTEM_TRUE@libexec_PROGRAMS = gpgme-w32spawn$(EXEEXT) -noinst_PROGRAMS = gpgme-tool$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/gpgme-config.in $(srcdir)/gpgme.h.in \ @@ -122,9 +122,9 @@ am__uninstall_files_from_dir = { \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" \ - "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" \ - "$(DESTDIR)$(includedir)" +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) @HAVE_W32_SYSTEM_TRUE@am__DEPENDENCIES_1 = versioninfo.lo am__libgpgme_glib_la_SOURCES_DIST = util.h conversion.c get-env.c \ @@ -244,7 +244,7 @@ libgpgme_la_OBJECTS = $(am_libgpgme_la_OBJECTS) libgpgme_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgpgme_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(libexec_PROGRAMS) $(noinst_PROGRAMS) +PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) gpgme_tool_SOURCES = gpgme-tool.c gpgme_tool_OBJECTS = gpgme-tool.$(OBJEXT) gpgme_tool_DEPENDENCIES = libgpgme.la @@ -358,6 +358,8 @@ GPGME_CONFIG_LIBS = @GPGME_CONFIG_LIBS@ GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@ GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@ GPG_ERROR_LIBS = @GPG_ERROR_LIBS@ +GPG_ERROR_MT_CFLAGS = @GPG_ERROR_MT_CFLAGS@ +GPG_ERROR_MT_LIBS = @GPG_ERROR_MT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ @@ -406,6 +408,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYSROOT = @SYSROOT@ VERSION = @VERSION@ VERSION_NUMBER = @VERSION_NUMBER@ abs_builddir = @abs_builddir@ @@ -465,7 +468,7 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -# Note: moc_kdpipeiodevice should actually be a dependcy below. +# Note: moc_kdpipeiodevice should actually be a dependecy below. EXTRA_DIST = gpgme-config.in gpgme.m4 libgpgme.vers ChangeLog-2011 \ gpgme.h.in versioninfo.rc.in gpgme.def moc_kdpipeiodevice.cpp @@ -544,6 +547,7 @@ libgpgme_pthread_la_SOURCES = $(main_sources) \ # versions, because then every object file is only compiled once. AM_CPPFLAGS = @GPG_ERROR_CFLAGS@ @QT4_CORE_CFLAGS@ AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@ @QT4_CORE_CFLAGS@ +gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @HAVE_W32_SYSTEM_TRUE@RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) @HAVE_W32_SYSTEM_TRUE@LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE) @HAVE_W32_SYSTEM_TRUE@SUFFIXES = .rc .lo @@ -589,7 +593,6 @@ libgpgme_pthread_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \ @BUILD_W32_QT_TRUE@libgpgme_qt_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \ @BUILD_W32_QT_TRUE@ @GPG_ERROR_LIBS@ @QT4_CORE_LIBS@ -gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ all: all-am .SUFFIXES: @@ -670,6 +673,52 @@ libgpgme-qt.la: $(libgpgme_qt_la_OBJECTS) $(libgpgme_qt_la_DEPENDENCIES) $(EXTRA $(AM_V_CXXLD)$(libgpgme_qt_la_LINK) $(am_libgpgme_qt_la_rpath) $(libgpgme_qt_la_OBJECTS) $(libgpgme_qt_la_LIBADD) $(LIBS) libgpgme.la: $(libgpgme_la_OBJECTS) $(libgpgme_la_DEPENDENCIES) $(EXTRA_libgpgme_la_DEPENDENCIES) $(AM_V_CCLD)$(libgpgme_la_LINK) -rpath $(libdir) $(libgpgme_la_OBJECTS) $(libgpgme_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ @@ -716,15 +765,6 @@ clean-libexecPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list - -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list gpgme-tool$(EXEEXT): $(gpgme_tool_OBJECTS) $(gpgme_tool_DEPENDENCIES) $(EXTRA_gpgme_tool_DEPENDENCIES) @rm -f gpgme-tool$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gpgme_tool_OBJECTS) $(gpgme_tool_LDADD) $(LIBS) @@ -1025,8 +1065,10 @@ check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -1061,8 +1103,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \ - clean-libtool clean-noinstPROGRAMS mostlyclean-am +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libexecPROGRAMS clean-libtool mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) ./$(DEPDIR) @@ -1089,8 +1131,8 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-binSCRIPTS install-libLTLIBRARIES \ - install-libexecPROGRAMS +install-exec-am: install-binPROGRAMS install-binSCRIPTS \ + install-libLTLIBRARIES install-libexecPROGRAMS install-html: install-html-am @@ -1130,27 +1172,29 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binSCRIPTS uninstall-libLTLIBRARIES \ - uninstall-libexecPROGRAMS uninstall-local uninstall-m4dataDATA \ +uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \ + uninstall-local uninstall-m4dataDATA \ uninstall-nodist_includeHEADERS .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ - clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \ - clean-noinstPROGRAMS ctags distclean distclean-compile \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \ + clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-binSCRIPTS install-data install-data-am \ - install-data-local install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES install-libexecPROGRAMS \ - install-m4dataDATA install-man install-nodist_includeHEADERS \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ + install-binPROGRAMS install-binSCRIPTS install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-libexecPROGRAMS install-m4dataDATA install-man \ + install-nodist_includeHEADERS install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-binSCRIPTS uninstall-libLTLIBRARIES \ uninstall-libexecPROGRAMS uninstall-local uninstall-m4dataDATA \ uninstall-nodist_includeHEADERS diff --git a/src/debug.h b/src/debug.h index c99b700..d0db573 100644 --- a/src/debug.h +++ b/src/debug.h @@ -187,8 +187,8 @@ _gpgme_trace_gpgme_error (gpgme_error_t err, const char *file, int line) #define TRACE_ERR(err) \ err == 0 ? (TRACE_SUC ()) : \ - (_gpgme_debug (_gpgme_trace_level, "%s: error: %s <%s>\n", \ - _gpgme_trace_func, gpgme_strerror (err), \ + (_gpgme_debug (_gpgme_trace_level, "%s:%d: error: %s <%s>\n", \ + _gpgme_trace_func, __LINE__, gpgme_strerror (err), \ gpgme_strsource (err)), _gpgme_debug_frame_end (), (err)) /* The cast to void suppresses GCC warnings. */ #define TRACE_SYSRES(res) \ diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 4df0f3e..30c3bfb 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -779,7 +779,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname) argc++; if (!gpg->cmd.used) argc++; /* --batch */ - argc += 1; /* --no-sk-comment */ + argc += 1; /* --no-sk-comments */ argv = calloc (argc + 1, sizeof *argv); if (!argv) @@ -864,7 +864,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname) } argc++; } - argv[argc] = strdup ("--no-sk-comment"); + argv[argc] = strdup ("--no-sk-comments"); if (!argv[argc]) { int saved_err = gpg_error_from_syserror (); @@ -1242,10 +1242,26 @@ read_colon_line (engine_gpg_t gpg) } assert (gpg->colon.fnc); - gpg->colon.fnc (gpg->colon.fnc_value, line ? line : buffer); - if (line) - free (line); - } + if (line) + { + char *linep = line; + char *endp; + + do + { + endp = strchr (linep, '\n'); + if (endp) + *endp++ = 0; + gpg->colon.fnc (gpg->colon.fnc_value, linep); + linep = endp; + } + while (linep && *linep); + + free (line); + } + else + gpg->colon.fnc (gpg->colon.fnc_value, buffer); + } /* To reuse the buffer for the next line we have to shift the remaining data to the buffer start and @@ -2071,6 +2087,7 @@ gpg_keylist_preprocess (char *line, char **r_line) #define NR_FIELDS 16 char *field[NR_FIELDS]; int fields = 0; + size_t n; *r_line = NULL; @@ -2106,16 +2123,34 @@ gpg_keylist_preprocess (char *line, char **r_line) pub:::::: as defined in 5.2. Machine Readable Indexes of the OpenPGP - HTTP Keyserver Protocol (draft). + HTTP Keyserver Protocol (draft). Modern versions of the SKS + keyserver return the fingerprint instead of the keyid. We + detect this here and use the v4 fingerprint format to convert + it to a key id. We want: pub:o::::::::::::: */ - if (asprintf (r_line, "pub:o%s:%s:%s:%s:%s:%s::::::::", - field[6], field[3], field[2], field[1], - field[4], field[5]) < 0) - return gpg_error_from_syserror (); + n = strlen (field[1]); + if (n > 16) + { + if (asprintf (r_line, + "pub:o%s:%s:%s:%s:%s:%s::::::::\n" + "fpr:::::::::%s:", + field[6], field[3], field[2], field[1] + n - 16, + field[4], field[5], field[1]) < 0) + return gpg_error_from_syserror (); + } + else + { + if (asprintf (r_line, + "pub:o%s:%s:%s:%s:%s:%s::::::::", + field[6], field[3], field[2], field[1], + field[4], field[5]) < 0) + return gpg_error_from_syserror (); + } + return 0; case RT_UID: diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c index f02fffa..d42179b 100644 --- a/src/gpgme-tool.c +++ b/src/gpgme-tool.c @@ -831,14 +831,17 @@ result_xml_escape (const char *data, char **buf) membuf_t mb; init_membuf (&mb, 128); - data_len = strlen (data); - for (i = 0; i < data_len; i++) + if (data) { - r = result_xml_escape_replacement (data[i]); - if (r) - put_membuf (&mb, r, strlen (r)); - else - put_membuf (&mb, data+i, 1); + data_len = strlen (data); + for (i = 0; i < data_len; i++) + { + r = result_xml_escape_replacement (data[i]); + if (r) + put_membuf (&mb, r, strlen (r)); + else + put_membuf (&mb, data+i, 1); + } } put_membuf (&mb, "", 1); *buf = get_membuf (&mb, NULL); @@ -3302,7 +3305,9 @@ cmd_keylist (assuan_context_t ctx, char *line) while (subkey) { result_xml_tag_start (&state, "subkey", NULL); /* FIXME: more data */ - result_add_fpr (&state, "fpr", subkey->fpr); + result_add_keyid (&state, "keyid", subkey->keyid); + if (subkey->fpr) + result_add_fpr (&state, "fpr", subkey->fpr); result_add_value (&state, "secret", subkey->secret); result_add_value (&state, "is_cardkey", subkey->is_cardkey); if (subkey->card_number) diff --git a/src/gpgme.m4 b/src/gpgme.m4 index fe17f21..6c2be44 100644 --- a/src/gpgme.m4 +++ b/src/gpgme.m4 @@ -1,5 +1,5 @@ # gpgme.m4 - autoconf macro to detect GPGME. -# Copyright (C) 2002, 2003, 2004 g10 Code GmbH +# Copyright (C) 2002, 2003, 2004, 2014 g10 Code GmbH # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -8,6 +8,8 @@ # This file is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Last-changed: 2014-10-02 AC_DEFUN([_AM_PATH_GPGME_CONFIG], @@ -15,9 +17,25 @@ AC_DEFUN([_AM_PATH_GPGME_CONFIG], AC_HELP_STRING([--with-gpgme-prefix=PFX], [prefix where GPGME is installed (optional)]), gpgme_config_prefix="$withval", gpgme_config_prefix="") - if test "x$gpgme_config_prefix" != x ; then - GPGME_CONFIG="$gpgme_config_prefix/bin/gpgme-config" + if test x"${GPGME_CONFIG}" = x ; then + if test x"${gpgme_config_prefix}" != x ; then + GPGME_CONFIG="${gpgme_config_prefix}/bin/gpgme-config" + else + case "${SYSROOT}" in + /*) + if test -x "${SYSROOT}/bin/gpgme-config" ; then + GPGME_CONFIG="${SYSROOT}/bin/gpgme-config" + fi + ;; + '') + ;; + *) + AC_MSG_WARN([Ignoring \$SYSROOT as it is not an absolute path.]) + ;; + esac + fi fi + AC_PATH_PROG(GPGME_CONFIG, gpgme-config, no) if test "$GPGME_CONFIG" != "no" ; then @@ -31,10 +49,35 @@ AC_DEFUN([_AM_PATH_GPGME_CONFIG], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` ]) + +AC_DEFUN([_AM_PATH_GPGME_CONFIG_HOST_CHECK], +[ + gpgme_config_host=`$GPGME_CONFIG --host 2>/dev/null || echo none` + if test x"$gpgme_config_host" != xnone ; then + if test x"$gpgme_config_host" != x"$host" ; then + AC_MSG_WARN([[ +*** +*** The config script $GPGME_CONFIG was +*** built for $gpgme_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-gpgme-prefix +*** to specify a matching config script or use \$SYSROOT. +***]]) + gpg_config_script_warn="$gpg_config_script_warn gpgme" + fi + fi +]) + + dnl AM_PATH_GPGME([MINIMUM-VERSION, dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgpgme and define GPGME_CFLAGS and GPGME_LIBS. dnl +dnl If a prefix option is not used, the config script is first +dnl searched in $SYSROOT/bin and then along $PATH. If the used +dnl config script does not match the host specification the script +dnl is added to the gpg_config_script_warn variable. +dnl AC_DEFUN([AM_PATH_GPGME], [ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl tmp=ifelse([$1], ,1:0.4.2,$1) @@ -57,7 +100,7 @@ AC_DEFUN([AM_PATH_GPGME], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes - else + else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes @@ -88,6 +131,7 @@ AC_DEFUN([AM_PATH_GPGME], GPGME_LIBS=`$GPGME_CONFIG --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) + _AM_PATH_GPGME_CONFIG_HOST_CHECK else GPGME_CFLAGS="" GPGME_LIBS="" @@ -126,7 +170,7 @@ AC_DEFUN([AM_PATH_GPGME_PTHREAD], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes - else + else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes @@ -158,6 +202,7 @@ AC_DEFUN([AM_PATH_GPGME_PTHREAD], GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) + _AM_PATH_GPGME_CONFIG_HOST_CHECK else GPGME_PTHREAD_CFLAGS="" GPGME_PTHREAD_LIBS="" @@ -195,7 +240,7 @@ AC_DEFUN([AM_PATH_GPGME_GLIB], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'` if test "$gpgme_version_major" -gt "$req_major"; then ok=yes - else + else if test "$gpgme_version_major" -eq "$req_major"; then if test "$gpgme_version_minor" -gt "$req_minor"; then ok=yes @@ -226,6 +271,7 @@ AC_DEFUN([AM_PATH_GPGME_GLIB], GPGME_GLIB_LIBS=`$GPGME_CONFIG --glib --libs` AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) + _AM_PATH_GPGME_CONFIG_HOST_CHECK else GPGME_GLIB_CFLAGS="" GPGME_GLIB_LIBS="" @@ -235,4 +281,3 @@ AC_DEFUN([AM_PATH_GPGME_GLIB], AC_SUBST(GPGME_GLIB_CFLAGS) AC_SUBST(GPGME_GLIB_LIBS) ]) - diff --git a/src/sign.c b/src/sign.c index c55441d..ffbde56 100644 --- a/src/sign.c +++ b/src/sign.c @@ -54,12 +54,24 @@ typedef struct } *op_data_t; +static void +release_signatures (gpgme_new_signature_t sig) +{ + while (sig) + { + gpgme_new_signature_t next = sig->next; + free (sig->fpr); + free (sig); + sig = next; + } +} + + static void release_op_data (void *hook) { op_data_t opd = (op_data_t) hook; gpgme_invalid_key_t invalid_signer = opd->result.invalid_signers; - gpgme_new_signature_t sig = opd->result.signatures; while (invalid_signer) { @@ -70,13 +82,7 @@ release_op_data (void *hook) invalid_signer = next; } - while (sig) - { - gpgme_new_signature_t next = sig->next; - free (sig->fpr); - free (sig); - sig = next; - } + release_signatures (opd->result.signatures); } @@ -86,6 +92,10 @@ gpgme_op_sign_result (gpgme_ctx_t ctx) void *hook; op_data_t opd; gpgme_error_t err; + gpgme_invalid_key_t inv_key, key; + gpgme_new_signature_t sig; + unsigned int inv_signers = 0; + unsigned int signatures = 0; TRACE_BEG (DEBUG_CTX, "gpgme_op_sign_result", ctx); @@ -97,49 +107,81 @@ gpgme_op_sign_result (gpgme_ctx_t ctx) return NULL; } - if (_gpgme_debug_trace ()) - { - gpgme_invalid_key_t inv_key = opd->result.invalid_signers; - gpgme_new_signature_t sig = opd->result.signatures; - int inv_signers = 0; - int signatures = 0; + for (inv_key = opd->result.invalid_signers; inv_key; inv_key = inv_key->next) + inv_signers++; + for (sig = opd->result.signatures; sig; sig = sig->next) + signatures++; - while (inv_key) - { - inv_signers++; - inv_key = inv_key->next; - } - while (sig) - { - signatures++; - sig = sig->next; - } + if (gpgme_signers_count (ctx) + && signatures + inv_signers != gpgme_signers_count (ctx)) + { + /* In this case at least one signatures was not created perhaps + due to a bad passphrase etc. Thus the entire message is + broken and should not be used. We add the already created + signatures to the invalid signers list and thus this case can + be detected. */ + TRACE_LOG3 ("result: invalid signers: %u, signatures: %u, count: %u", + inv_signers, signatures, gpgme_signers_count (ctx)); + + for (sig = opd->result.signatures; sig; sig = sig->next) + { + key = calloc (1, sizeof *key); + if (!key) + { + TRACE_SUC0 ("out of core; result=(null)"); + return NULL; + } + if (sig->fpr) + { + key->fpr = strdup (sig->fpr); + if (!key->fpr) + { + free (key); + TRACE_SUC0 ("out of core; result=(null)"); + return NULL; + } + } + key->reason = GPG_ERR_GENERAL; + + inv_key = opd->result.invalid_signers; + if (inv_key) + { + for (; inv_key->next; inv_key = inv_key->next) + ; + inv_key->next = key; + } + else + opd->result.invalid_signers = key; + } + + release_signatures (opd->result.signatures); + opd->result.signatures = NULL; + } + if (_gpgme_debug_trace()) + { TRACE_LOG2 ("result: invalid signers: %i, signatures: %i", inv_signers, signatures); - inv_key = opd->result.invalid_signers; - while (inv_key) + for (inv_key=opd->result.invalid_signers; inv_key; inv_key=inv_key->next) { TRACE_LOG3 ("result: invalid signer: fpr=%s, reason=%s <%s>", inv_key->fpr, gpgme_strerror (inv_key->reason), gpgme_strsource (inv_key->reason)); - inv_key = inv_key->next; } - sig = opd->result.signatures; - while (sig) + for (sig = opd->result.signatures; sig; sig = sig->next) { TRACE_LOG6 ("result: signature: type=%i, pubkey_algo=%i, " "hash_algo=%i, timestamp=%li, fpr=%s, sig_class=%i", sig->type, sig->pubkey_algo, sig->hash_algo, sig->timestamp, sig->fpr, sig->sig_class); - sig = sig->next; } - } + } TRACE_SUC1 ("result=%p", &opd->result); return &opd->result; } + static gpgme_error_t parse_sig_created (char *args, gpgme_new_signature_t *sigp, -- cgit v1.2.3