Page MenuHome GnuPG

No OneTemporary

diff --git a/Makefile.am b/Makefile.am
index 6299f180..283f61ad 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,166 +1,164 @@
# Makefile.am - Installer for GnuPG 4 Windows Makefile.
# Copyright (C) 2005, 2008, 2012 g10 Code GmbH
#
# This file is part of GPG4Win.
#
# GPG4Win 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
# (at your option) any later version.
#
# GPG4Win 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/>.
ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = dist-xz no-dist-gzip
DISTCHECK_CONFIGURE_FLAGS = --host=i686-w64-mingw32
if BUILD_GPG4WIN
po = po
else
po =
endif
if BUILD_GPG4WIN
doc = doc
else
doc =
endif
SUBDIRS = ${po} packages ${doc} src
# find patches -type f | sort | sed 's/$/ \\/' | sed 's/^/ /'
# find patches-appimage -type f | sort | sed 's/$/ \\/' | sed 's/^/ /'
EXTRA_DIST = autogen.rc autogen.sh README.GIT ONEWS \
doc/license-page doc/GPLv3 \
build-aux/git-log-footer build-aux/git-log-fix \
build-aux/authenticode-sign.sh \
docker/appimage/Dockerfile \
docker/build-appimage-docker-image.sh \
docker/build-gpg4win-docker-image.sh \
docker/gpg4win-bullseye/Dockerfile \
docker/run-appimage-build.sh \
docker/run-gpg4win-build.sh \
patches/breeze-icons/0001-Add-folder-edit-sign-encrypt-icon.patch \
patches/breeze-icons/add-the-nose.patch \
patches/breeze-icons/azz-Make-all-breeze-icons-available-in-breeze-dark.patch \
patches/breeze-icons/subset-crossbuild.patch \
patches/extra-cmake-modules/0001-Use-BIN_INSTALL_DIR-data-for-DATAROOTDIR-on-Windows.patch \
- patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch \
- patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch \
- patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch \
+ patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch \
+ patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch \
patches/gpgol-2.6.0/0001-Fix-fixing-T6646.patch \
patches/jpeg/fix-redefine.patch \
patches/kconfig/0001-Read-defaults-from-Windows-registry.patch \
patches/kconfigwidgets/0001-Fix-crash-on-exit-on-Windows.patch \
patches/kconfigwidgets/0001-Make-QDbus-optional.patch \
patches/kcoreaddons/0001-Fix-MINGW-build.patch \
patches/kguiaddons/0001-DRAFT-There-is-no-dark-mode-on-old-Windows.patch \
patches/ki18n/0001-Undef-snprintf-for-windows.patch \
patches/kiconthemes/0001-Make-DBus-optional.patch \
patches/kiconthemes/dark-mode-detection.patch \
patches/kio/0001-WIP-Remove-dependency-to-dbus.patch \
patches/kio/FileManagerWindowJob.patch \
patches/kleopatra/0001-Revert-change-of-selection-of-own-keys-to-selection-.patch \
patches/kleopatra/0001-Update-status-bar-when-distribution-settings-change.patch \
patches/kleopatra/0002-Use-RSAKeySizes-and-PGPKeyType-again.patch \
patches/kleopatra/set-windows-registry.patch \
patches/kparts/0001-Apply-implicit-android-DBUS-fix-for-Win.patch \
patches/kparts/disable-jobuidelegate.patch \
patches/kwidgetsaddons/0001-Set-the-modes-on-the-date-picker.patch \
patches/kwidgetsaddons/0002-Remove-No-date-option-from-date-picker-popup-used-by.patch \
patches/kwidgetsaddons/fix-height-of-text-after-update.patch \
patches/kxmlgui/0001-make-qdbus-optional.patch \
patches/kxmlgui/0002-stretch-aboutpage.patch \
patches/kxmlgui/0004-Cruedly-disable-KSendbugmail.patch \
patches/libical/workaround-weird-mingw-10.0.0-issue.patch \
patches/libkleo/0001-Use-RSAKeySizes-and-PGPKeyType-again.patch \
patches/okular/0001-Add-GnuPG-specific-manifest-to-okular.patch \
patches/okular/0001-Add-support-to-customize-about-data.patch \
patches/okular/lower-cmake-requirement.patch \
patches/qtbase/0001-Gpg4win-qstandardpaths-patch.patch \
patches/qtbase/0002-Gpg4win-theme-names-and-relpaths.patch \
patches/qtbase/add-kleopatras-mime-types.patch \
patches/qtbase/CVE-2023-32763-qtbase-5.15.patch \
patches/qtbase/CVE-2023-37369-qtbase-5.15.patch \
patches/qtbase/CVE-2023-43114-5.15.patch \
patches/qtbase/fix-high-contrast-item-view-selection-color.patch \
patches/qtbase/fix-tooltip-text-color-with-dark-theme.patch \
patches/qtsvg/CVE-2023-32573-qtsvg-5.15.patch \
patches/qttools/disable-most-tools.patch \
patches/sonnet/0001-W32-Force-ispellchecker-for-sonnet.patch \
- patches-appimage/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch \
- patches-appimage/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch \
- patches-appimage/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch \
+ patches-appimage/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch \
+ patches-appimage/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch \
patches-appimage/kwidgetsaddons/0001-Set-the-modes-on-the-date-picker.patch \
patches-appimage/kwidgetsaddons/0002-Remove-No-date-option-from-date-picker-popup-used-by.patch \
patches-appimage/kwidgetsaddons/fix-height-of-text-after-update.patch \
patches-appimage/kleopatra/0001-Revert-change-of-selection-of-own-keys-to-selection-.patch \
patches-appimage/kleopatra/0001-Update-status-bar-when-distribution-settings-change.patch \
patches-appimage/kleopatra/0002-Use-RSAKeySizes-and-PGPKeyType-again.patch \
patches-appimage/okular/0001-Make-KF5Pty-dependency-optional.patch \
patches-appimage/okular/0001-Add-support-to-customize-about-data.patch \
patches-appimage/okular/lower-cmake-requirement.patch \
patches-appimage/poppler/fix-gpg-error-include.patch \
patches-appimage/qtbase/CVE-2023-32763-qtbase-5.15.patch \
patches-appimage/qtbase/CVE-2023-37369-qtbase-5.15.patch \
patches-appimage/qtbase/CVE-2023-43114-5.15.patch \
patches-appimage/qtbase/add-kleopatras-mime-types.patch \
patches-appimage/qtsvg/CVE-2023-32573-qtsvg-5.15.patch \
patches-appimage/qtwayland-5.15.0/00-disable-wayland-server.patch
copy-news:
cp NEWS doc/website/NEWS.last
copy-release: gpg4win-$(VERSION).tar.bz2 installers/gpg4win-$(VERSION).exe \
installers/gpg4win-light-$(VERSION).exe \
installers/gpg4win-vanilla-$(VERSION).exe
@echo Copying $(VERSION) to $(RELEASEHOST) >&2
@set -e;\
if ssh "$$(echo $(RELEASEHOST)|cut -d: -f -1)" \
test -f "$$(echo $(RELEASEHOST)/gpg4win-$(VERSION).exe|cut -d: -f2-)";\
then echo "This release has already been copied to the server" >&2 ;\
else scp gpg4win-$(VERSION).tar.bz2 \
installers/gpg4win-$(VERSION).exe \
installers/gpg4win-light-$(VERSION).exe \
installers/gpg4win-vanilla-$(VERSION).exe \
installers/gpg4win-src-$(VERSION).exe $(RELEASEHOST)/ ;\
for f in en de ; do \
scp src/README.$$f.txt \
$(RELEASEHOST)/README-$(VERSION).$$f.txt; \
done;\
fi
dist-hook: gen-ChangeLog
gen_start_date = 2012-03-26T00:00:00
.PHONY: gen-ChangeLog
gen-ChangeLog:
set -e; \
if test -d $(top_srcdir)/.git; then \
(cd $(top_srcdir) && \
$(GITLOG_TO_CHANGELOG) --append-dot --tear-off \
--amend=build-aux/git-log-fix \
--since=$(gen_start_date) ) > $(distdir)/cl-t; \
cat $(top_srcdir)/build-aux/git-log-footer >> $(distdir)/cl-t;\
rm -f $(distdir)/ChangeLog; \
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
fi
download: packages/packages.common packages/packages.4 packages/packages.3
(cd packages; ./download.sh)
msi:
$(MAKE) $(AM_MAKEFLAGS) -C src msi
msi-signed:
$(MAKE) $(AM_MAKEFLAGS) -C src msi-signed
msi-upload:
$(MAKE) $(AM_MAKEFLAGS) -C src msi-upload
diff --git a/patches-appimage/gpgme-1.24.2 b/patches-appimage/gpgme-1.24.2
deleted file mode 120000
index a2ba404d..00000000
--- a/patches-appimage/gpgme-1.24.2
+++ /dev/null
@@ -1 +0,0 @@
-../patches/gpgme-1.24.2
\ No newline at end of file
diff --git a/patches-appimage/gpgme-1.24.3 b/patches-appimage/gpgme-1.24.3
new file mode 120000
index 00000000..7e2b3bb9
--- /dev/null
+++ b/patches-appimage/gpgme-1.24.3
@@ -0,0 +1 @@
+../patches/gpgme-1.24.3
\ No newline at end of file
diff --git a/patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch b/patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch
deleted file mode 100755
index 650e60d5..00000000
--- a/patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-#! /bin/sh
-patch -p1 -f $* < $0
-exit $?
-
-From a4945675ece2c1e915fc49298adfd927737ede3d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= <dev@ingo-kloecker.de>
-Date: Fri, 11 Apr 2025 10:26:31 +0200
-Subject: [PATCH 1/2] cpp: Ensure that all transitions go from one state to a
- different state
-
-* src/gpgsignkeyeditinteractor.cpp (makeTable): Replace transitions from
-CONFIRM to CONFIRM with transitions from CONFIRM to CONFIRM2 and vice
-versa. Add transitions from CONFIRM2 to some other state for all
-transitions from CONFIRM to some other state.
---
-
-The state machine gets stuck if a transition doesn't change the state
-but an action is required. To avoid this situation the CONFIRM2 state
-was introduced, but it was not used correctly.
-
-GnuPG-bug-id: 7600
-
-Taken from gpgmepp commit aee2b30482406e677dbddf1a68b2a11a5dc70adf
----
- lang/cpp/src/gpgsignkeyeditinteractor.cpp | 11 ++++++++---
- 1 file changed, 8 insertions(+), 3 deletions(-)
-
-diff --git a/lang/cpp/src/gpgsignkeyeditinteractor.cpp b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-index 164cfc03..f2e0ba04 100644
---- a/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-+++ b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-@@ -196,7 +196,7 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(COMMAND, GET_BOOL, "keyedit.sign_all.okay", UIDS_ANSWER_SIGN_ALL);
- addEntry(COMMAND, GET_BOOL, "sign_uid.expired_okay", REJECT_SIGN_EXPIRED);
- addEntry(COMMAND, GET_BOOL, "sign_uid.okay", CONFIRM);
-- addEntry(COMMAND, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM2);
-+ addEntry(COMMAND, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
- addEntry(COMMAND, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
- addEntry(COMMAND, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(UIDS_ANSWER_SIGN_ALL, GET_BOOL, "sign_uid.okay", CONFIRM);
-@@ -209,17 +209,22 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(SET_TRUST_REGEXP, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(SET_CHECK_LEVEL, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(SET_EXPIRE, GET_BOOL, "sign_uid.class", SET_CHECK_LEVEL);
-- addEntry(CONFIRM, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
-+ addEntry(CONFIRM, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM2);
-+ addEntry(CONFIRM2, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
- addEntry(DUPE_OK, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(DUPE_OK2, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(DUPE_OK, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(DUPE_OK2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
-- addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM);
-+ addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM2);
- addEntry(CONFIRM2, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(CONFIRM, GET_LINE, "keyedit.prompt", COMMAND);
-+ addEntry(CONFIRM2, GET_LINE, "keyedit.prompt", COMMAND);
- addEntry(CONFIRM, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
-+ addEntry(CONFIRM2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM, GET_LINE, "sign_uid.expire", SET_EXPIRE);
-+ addEntry(CONFIRM2, GET_LINE, "sign_uid.expire", SET_EXPIRE);
- addEntry(CONFIRM, GET_LINE, "sign_uid.class", SET_CHECK_LEVEL);
-+ addEntry(CONFIRM2, GET_LINE, "sign_uid.class", SET_CHECK_LEVEL);
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_LINE, "keyedit.prompt", COMMAND);
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
---
-2.39.2
diff --git a/patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch b/patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch
deleted file mode 100755
index 72e19046..00000000
--- a/patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /bin/sh
-patch -p1 -f $* < $0
-exit $?
-
-
-From 64bb704a25ea1384666d5f0d5202363f4271d948 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= <dev@ingo-kloecker.de>
-Date: Fri, 11 Apr 2025 10:28:20 +0200
-Subject: [PATCH 2/2] cpp: Validate the transition map
-
-* lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable): Assert that
-all transitions go from one state to a different state.
---
-
-The state machine gets stuck if a transition doesn't change the state.
-Make sure that this cannot happen again by mistake.
-
-GnuPG-bug-id: 7600
-Taken from gpgmepp commit 6f2e91d4d25afa6934ceaf1563a4d826a904d644
----
- lang/cpp/src/gpgsignkeyeditinteractor.cpp | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/lang/cpp/src/gpgsignkeyeditinteractor.cpp b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-index f2e0ba04..b1ecad3b 100644
---- a/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-+++ b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-@@ -239,6 +239,10 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(ERROR, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(QUIT, GET_BOOL, "keyedit.save.okay", SAVE);
- #undef addEntry
-+ // validate the transition map; there must not be a transition without state change
-+ for (auto it = tab.cbegin(); it != tab.cend(); ++it) {
-+ assert(std::get<0>(it->first) != it->second);
-+ }
- return tab;
- }
-
---
-2.39.2
diff --git a/patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch b/patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch
deleted file mode 100755
index b09f9c6e..00000000
--- a/patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /bin/sh
-patch -p1 -f $* < $0
-exit $?
-
-From e327305b9669107235ebe5e1e929988c1adefce9 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= <dev@ingo-kloecker.de>
-Date: Tue, 15 Apr 2025 09:15:59 +0200
-Subject: [PATCH] cpp: Add missing transition, remove two ignored (and wrong)
- transitions
-
-* lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable): Remove two
-transitions. Add one transition.
-
-* lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable)
-<sign_uid.dupe_okay>: Add one more transition.
---
-
-This adds a missing transition for the CONFIRM2 state which ensures
-that the certification is properly completed in case two confirmations
-were requested. And it removes two useless (and wrong) transitions
-which are overwritten by two later correct transitions in the map.
-
-GnuPG-bug-id: 7600
-This is gpgmepp commit 5b77f4072d03342b8719bbe93fc77641fffb476a
-
-The second patch fixed a bug seen before we could test Ingo's
-patch. - wk
----
- lang/cpp/src/gpgsignkeyeditinteractor.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/lang/cpp/src/gpgsignkeyeditinteractor.cpp b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-index b1ecad3b..8ce54abd 100644
---- a/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-+++ b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-@@ -217,8 +217,6 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(DUPE_OK2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM2);
- addEntry(CONFIRM2, GET_BOOL, "sign_uid.okay", CONFIRM);
-- addEntry(CONFIRM, GET_LINE, "keyedit.prompt", COMMAND);
-- addEntry(CONFIRM2, GET_LINE, "keyedit.prompt", COMMAND);
- addEntry(CONFIRM, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM, GET_LINE, "sign_uid.expire", SET_EXPIRE);
-@@ -234,7 +232,9 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
- addEntry(DUPE_OK, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK2);
- addEntry(DUPE_OK2, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
-+ addEntry(CONFIRM, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
- addEntry(CONFIRM, GET_LINE, "keyedit.prompt", QUIT);
-+ addEntry(CONFIRM2, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(REJECT_SIGN_EXPIRED, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(ERROR, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(QUIT, GET_BOOL, "keyedit.save.okay", SAVE);
---
-2.39.2
diff --git a/patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch b/patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch
new file mode 100755
index 00000000..670c9dad
--- /dev/null
+++ b/patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch
@@ -0,0 +1,284 @@
+#! /bin/sh
+patch -p1 -l -f $* < $0
+exit $?
+
+
+From 52bde50b879c2b9318c87eb9f377bed6557366e2 Mon Sep 17 00:00:00 2001
+From: NIIBE Yutaka <gniibe@fsij.org>
+Date: Fri, 29 Aug 2025 09:28:06 +0900
+Subject: [PATCH 1/2] gpgsm: Introduce two phase interactions to consume diag
+ output.
+
+* src/engine-gpgsm.c (prepare): Move the first part from...
+(start): ... here.
+(gpgsm_decrypt, gpgsm_delete, gpgsm_encrypt)
+(gpgsm_export, gpgsm_export_ext, gpgsm_genkey)
+(gpgsm_import, gpgsm_keylist, gpgsm_keylist_ext)
+(gpgsm_sign, gpgsm_verify, gpgsm_getauditlog)
+(gpgsm_passwd): Follow the change.
+
+--
+
+GnuPG-bug-id: 7759
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
+---
+ src/engine-gpgsm.c | 113 +++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 89 insertions(+), 24 deletions(-)
+
+diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
+index e9d69d7a..37236bc2 100644
+--- a/src/engine-gpgsm.c
++++ b/src/engine-gpgsm.c
+@@ -1166,34 +1166,15 @@ add_io_cb (engine_gpgsm_t gpgsm, iocb_data_t *iocbd, gpgme_io_cb_t handler)
+
+
+ static gpgme_error_t
+-start (engine_gpgsm_t gpgsm, const char *command)
++prepare (engine_gpgsm_t gpgsm)
+ {
+- gpgme_error_t err;
++ gpgme_error_t err = 0;
+ assuan_fd_t afdlist[5];
++ /* FIXME: the type int and assuan_fd_t may be incompatible. */
+ int fdlist[5];
+ int nfds;
+ int i;
+
+- if (*gpgsm->request_origin)
+- {
+- char *cmd;
+-
+- cmd = _gpgme_strconcat ("OPTION request-origin=",
+- gpgsm->request_origin, NULL);
+- if (!cmd)
+- return gpg_error_from_syserror ();
+- err = gpgsm_assuan_simple_command (gpgsm, cmd, NULL, NULL);
+- free (cmd);
+- if (err && gpg_err_code (err) != GPG_ERR_UNKNOWN_OPTION)
+- return err;
+- }
+-
+- gpgsm_assuan_simple_command (gpgsm,
+- gpgsm->flags.offline ?
+- "OPTION offline=1":
+- "OPTION offline=0" ,
+- NULL, NULL);
+-
+ /* We need to know the fd used by assuan for reads. We do this by
+ using the assumption that the first returned fd from
+ assuan_get_active_fds() is always this one. */
+@@ -1217,7 +1198,36 @@ start (engine_gpgsm_t gpgsm, const char *command)
+
+ gpgsm->status_cb.fd = _gpgme_io_dup (fdlist[0]);
+ if (gpgsm->status_cb.fd < 0)
+- return gpg_error_from_syserror ();
++ err = gpg_error_from_syserror ();
++
++ return err;
++}
++
++
++static gpgme_error_t
++start (engine_gpgsm_t gpgsm, const char *command)
++{
++ gpgme_error_t err;
++
++ if (*gpgsm->request_origin)
++ {
++ char *cmd;
++
++ cmd = _gpgme_strconcat ("OPTION request-origin=",
++ gpgsm->request_origin, NULL);
++ if (!cmd)
++ return gpg_error_from_syserror ();
++ err = gpgsm_assuan_simple_command (gpgsm, cmd, NULL, NULL);
++ free (cmd);
++ if (err && gpg_err_code (err) != GPG_ERR_UNKNOWN_OPTION)
++ return err;
++ }
++
++ gpgsm_assuan_simple_command (gpgsm,
++ gpgsm->flags.offline ?
++ "OPTION offline=1":
++ "OPTION offline=0" ,
++ NULL, NULL);
+
+ if (_gpgme_io_set_close_notify (gpgsm->status_cb.fd,
+ close_notify_handler, gpgsm))
+@@ -1319,6 +1329,10 @@ gpgsm_decrypt (void *engine,
+ if (!gpgsm)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ err = send_input_size_hint (gpgsm, ciph);
+ if (err)
+ return err;
+@@ -1334,7 +1348,7 @@ gpgsm_decrypt (void *engine,
+ gpgsm_clear_fd (gpgsm, MESSAGE_FD);
+ gpgsm->inline_data = NULL;
+
+- err = start (engine, "DECRYPT");
++ err = start (gpgsm, "DECRYPT");
+ return err;
+ }
+
+@@ -1397,12 +1411,17 @@ gpgsm_delete (void *engine, gpgme_key_t key, unsigned int flags)
+ }
+ *linep = '\0';
+
++ err = prepare (gpgsm);
++ if (err)
++ goto leave;
++
+ gpgsm_clear_fd (gpgsm, OUTPUT_FD);
+ gpgsm_clear_fd (gpgsm, INPUT_FD);
+ gpgsm_clear_fd (gpgsm, MESSAGE_FD);
+ gpgsm->inline_data = NULL;
+
+ err = start (gpgsm, line);
++ leave:
+ free (line);
+
+ return err;
+@@ -1539,6 +1558,10 @@ gpgsm_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring,
+ if (flags & (GPGME_ENCRYPT_ARCHIVE | GPGME_ENCRYPT_FILE))
+ return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ if ((flags & GPGME_ENCRYPT_NO_ENCRYPT_TO))
+ {
+ err = gpgsm_assuan_simple_command (gpgsm,
+@@ -1621,6 +1644,10 @@ gpgsm_export (void *engine, const char *pattern, gpgme_export_mode_t mode,
+ }
+ strcat (cmd, pattern);
+
++ err = prepare (gpgsm);
++ if (err)
++ goto leave;
++
+ gpgsm->output_cb.data = keydata;
+ err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor"
+ : map_data_enc (gpgsm->output_cb.data));
+@@ -1631,6 +1658,7 @@ gpgsm_export (void *engine, const char *pattern, gpgme_export_mode_t mode,
+ gpgsm->inline_data = NULL;
+
+ err = start (gpgsm, cmd);
++ leave:
+ free (cmd);
+ return err;
+ }
+@@ -1728,6 +1756,10 @@ gpgsm_export_ext (void *engine, const char *pattern[], gpgme_export_mode_t mode,
+ }
+ *linep = '\0';
+
++ err = prepare (gpgsm);
++ if (err)
++ goto leave;
++
+ gpgsm->output_cb.data = keydata;
+ err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor"
+ : map_data_enc (gpgsm->output_cb.data));
+@@ -1738,6 +1770,7 @@ gpgsm_export_ext (void *engine, const char *pattern[], gpgme_export_mode_t mode,
+ gpgsm->inline_data = NULL;
+
+ err = start (gpgsm, line);
++ leave:
+ free (line);
+ return err;
+ }
+@@ -1764,6 +1797,10 @@ gpgsm_genkey (void *engine,
+ if (!pubkey || seckey)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ gpgsm->input_cb.data = help_data;
+ err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
+ if (err)
+@@ -1815,6 +1852,10 @@ gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray,
+ if (keydata && keyarray)
+ return gpg_error (GPG_ERR_INV_VALUE); /* Only one is allowed. */
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ dataenc = gpgme_data_get_encoding (keydata);
+
+ if (keyarray)
+@@ -1918,6 +1959,10 @@ gpgsm_keylist (void *engine, const char *pattern, int secret_only,
+ if (!pattern)
+ pattern = "";
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ /* Hack to make sure that the agent is started. Only if the agent
+ has been started an application may connect to the agent via
+ GPGME_PROTOCOL_ASSUAN - for example to look for smartcards. We
+@@ -2007,6 +2052,10 @@ gpgsm_keylist_ext (void *engine, const char *pattern[], int secret_only,
+ if (mode & GPGME_KEYLIST_MODE_EXTERN)
+ list_mode |= 2;
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ /* Always send list-mode option because RESET does not reset it. */
+ if (gpgrt_asprintf (&line, "OPTION list-mode=%d", (list_mode & 3)) < 0)
+ return gpg_error_from_syserror ();
+@@ -2134,6 +2183,10 @@ gpgsm_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
+ | GPGME_SIG_MODE_FILE))
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ /* FIXME: This does not work as RESET does not reset it so we can't
+ revert back to default. */
+ if (include_certs != GPGME_INCLUDE_CERTS_DEFAULT)
+@@ -2208,6 +2261,10 @@ gpgsm_verify (void *engine, gpgme_verify_flags_t flags, gpgme_data_t sig,
+ if (flags & GPGME_VERIFY_ARCHIVE)
+ return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ gpgsm->input_cb.data = sig;
+ err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
+ if (err)
+@@ -2293,6 +2350,10 @@ gpgsm_getauditlog (void *engine, gpgme_data_t output, unsigned int flags)
+ if (!gpgsm->assuan_ctx)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ #if USE_DESCRIPTOR_PASSING
+ gpgsm->output_cb.data = output;
+ err = gpgsm_set_fd (gpgsm, OUTPUT_FD, 0);
+@@ -2386,6 +2447,10 @@ gpgsm_passwd (void *engine, gpgme_key_t key, unsigned int flags)
+ if (!key || !key->subkeys || !key->subkeys->fpr)
+ return gpg_error (GPG_ERR_INV_CERT_OBJ);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ if (gpgrt_asprintf (&line, "PASSWD -- %s", key->subkeys->fpr) < 0)
+ return gpg_error_from_syserror ();
+
+--
+2.39.2
diff --git a/patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch b/patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch
new file mode 100755
index 00000000..ffc80206
--- /dev/null
+++ b/patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch
@@ -0,0 +1,70 @@
+#! /bin/sh
+patch -p1 -l -f $* < $0
+exit $?
+
+From cff9df67d34fa21fc8f3ba47300e1671c4526629 Mon Sep 17 00:00:00 2001
+From: NIIBE Yutaka <gniibe@fsij.org>
+Date: Fri, 29 Aug 2025 14:49:42 +0900
+Subject: [PATCH 2/2] gpgsm: Extend gpgsm_assuan_simple_command to consule diag
+ output.
+
+* src/engine-gpgsm.c (gpgsm_assuan_simple_command): Take care about
+diag output.
+
+--
+
+GnuPG-bug-id: 7759
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
+
+
+--- a/src/engine-gpgsm.c 2025-09-17 12:31:24.359626906 +0200
++++ b/src/engine-gpgsm.c 2025-09-17 12:33:35.415622806 +0200
+@@ -691,6 +691,23 @@
+ gpg_error_t err, cb_err;
+ char *line;
+ size_t linelen;
++ struct io_select_fd_s fds[2];
++ struct io_cb_data iocb_data;
++ int nfds = 0;
++
++ iocb_data.handler_value = gpgsm->diag_cb.data;
++ iocb_data.op_err = 0;
++
++ memset (fds, 0, sizeof (struct io_select_fd_s)*2);
++ fds[nfds].fd = gpgsm->status_cb.fd;
++ fds[nfds].for_read = 1;
++ nfds++;
++ if (gpgsm->diag_cb.fd != -1)
++ {
++ fds[nfds].fd = gpgsm->diag_cb.fd;
++ fds[nfds].for_read = 1;
++ nfds++;
++ }
+
+ err = assuan_write_line (ctx, cmd);
+ if (err)
+@@ -699,6 +716,24 @@
+ cb_err = 0;
+ do
+ {
++ fds[0].signaled = fds[1].signaled = 0;
++ if (gpgsm->status_cb.fd != -1
++ && _gpgme_io_select (fds, nfds, 0) < 0)
++ {
++ err = gpg_error_from_syserror ();
++ break;
++ }
++
++ if (gpgsm->diag_cb.fd != -1 && fds[1].signaled)
++ {
++ err = _gpgme_data_inbound_handler (&iocb_data, gpgsm->diag_cb.fd);
++ if (err)
++ break;
++ }
++
++ if (gpgsm->status_cb.fd != -1 && !fds[0].signaled)
++ continue;
++
+ err = assuan_read_line (ctx, &line, &linelen);
+ if (err)
+ break;

File Metadata

Mime Type
text/x-diff
Expires
Tue, Apr 14, 9:23 PM (3 h, 47 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
7f/b3/2d3663ef101cebe8e531b615c5be

Event Timeline