gpgme: Fix mkstemp bug
Fixes https://github.com/Alexpux/MINGW-packages/issues/724 kind of .. issue 724 is down to the fact that GetModuleFileName is used as a landmark to locate other executables needed by gpgme. However if the static library is linked to then the executable will often not be in /mingw64/bin and the landmark location is irrelevant. I need to come up with something else instead, but the only idea I've got at present is to use a registry key for where MSYS2 was installed. .. breaking multiple installations ... and using the registry, two things that we've worked hard to avoid so far. Perhaps an env. var. is the best we can do here. Anyway, the landmark problem can be mitigated by putting the exe in the /mingw64/bin folder or perhaps moving the gnupg programs to the same folder as the exe. Both options are horrible. Whith that issue avoided, the next bug is the temporary files used by gpgme to communicate with gnupg are opened with _O_TEMPORARY meaning they get deleted when they're closed before the spawnee has had a chance to read them. To avoid this the file is reopened with the _O_TEMPORARY flag removed.
This commit is contained in:
12
mingw-w64-gpgme/0001-fix-incorrect-fd-pointer-check.patch
Normal file
12
mingw-w64-gpgme/0001-fix-incorrect-fd-pointer-check.patch
Normal file
@@ -0,0 +1,12 @@
|
||||
diff -urN a/src/w32-util.c b/src/w32-util.c
|
||||
--- a/src/w32-util.c 2014-07-30 10:40:16.000000000 +0100
|
||||
+++ b/src/w32-util.c 2015-08-04 22:35:22.308898700 +0100
|
||||
@@ -709,7 +709,7 @@
|
||||
return -1;
|
||||
strcpy (stpcpy (tmpname, tmp), "\\gpgme-XXXXXX");
|
||||
*fd = mkstemp (tmpname);
|
||||
- if (fd < 0)
|
||||
+ if (*fd < 0)
|
||||
{
|
||||
free (tmpname);
|
||||
return -1;
|
||||
@@ -0,0 +1,31 @@
|
||||
diff -urN a/src/w32-util.c b/src/w32-util.c
|
||||
--- a/src/w32-util.c 2015-08-04 22:35:22.574099100 +0100
|
||||
+++ b/src/w32-util.c 2015-08-04 22:35:22.948499800 +0100
|
||||
@@ -42,6 +42,7 @@
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include <io.h>
|
||||
+#include <share.h>
|
||||
|
||||
#if __MINGW64_VERSION_MAJOR >= 2
|
||||
# define _WIN32_IE 0x0501 /* Required by mingw64 toolkit. */
|
||||
@@ -715,6 +716,19 @@
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ /* mingw-w64's mkstemp implementation opens files with _O_TEMPORARY
|
||||
+ meaning they get deleted when the last handle to them is closed.
|
||||
+ While ReOpenFile () could be used to work around this, it is not
|
||||
+ available until Vista. Instead, close and recreate. */
|
||||
+ close (*fd);
|
||||
+ *fd = _sopen(tmpname,
|
||||
+ _O_RDWR | _O_CREAT | _O_EXCL | _O_BINARY,
|
||||
+ _SH_DENYRW, _S_IREAD | _S_IWRITE);
|
||||
+ if (*fd < 0)
|
||||
+ {
|
||||
+ free (tmpname);
|
||||
+ return -1;
|
||||
+ }
|
||||
*name = tmpname;
|
||||
return 0;
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
--- gpgme-1.5.4/src/w32-util.c.orig 2015-04-30 09:13:53.846200000 +0300
|
||||
+++ gpgme-1.5.4/src/w32-util.c 2015-04-30 09:14:42.224800000 +0300
|
||||
@@ -595,6 +595,7 @@
|
||||
diff -urN a/src/w32-util.c b/src/w32-util.c
|
||||
--- a/src/w32-util.c 2015-08-04 22:35:23.135700100 +0100
|
||||
+++ b/src/w32-util.c 2015-08-04 22:35:23.354100500 +0100
|
||||
@@ -596,6 +596,7 @@
|
||||
static const char letters[] =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
@@ -8,7 +9,7 @@
|
||||
/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||
rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
|
||||
does not exist at the time of the call to mkstemp. TMPL is
|
||||
@@ -677,7 +678,7 @@
|
||||
@@ -678,7 +679,7 @@
|
||||
gpg_err_set_errno (EEXIST);
|
||||
return -1;
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
--- gpgme-1.5.5/configure.ac.orig 2015-07-31 09:24:13.396403000 +0300
|
||||
+++ gpgme-1.5.5/configure.ac 2015-07-31 09:24:48.701872100 +0300
|
||||
diff -urN a/configure.ac b/configure.ac
|
||||
--- a/configure.ac 2015-08-04 22:35:23.556900900 +0100
|
||||
+++ b/configure.ac 2015-08-04 22:35:24.087301800 +0100
|
||||
@@ -161,10 +161,10 @@
|
||||
*-mingw32ce*|*-mingw32*)
|
||||
have_dosish_system=yes
|
||||
@@ -15,9 +16,10 @@
|
||||
#component_system='COM+'
|
||||
|
||||
AM_PATH_GLIB_2_0
|
||||
--- gpgme-1.5.5/src/w32-util.c.orig 2015-07-31 09:27:08.507890100 +0300
|
||||
+++ gpgme-1.5.5/src/w32-util.c 2015-07-31 09:51:04.830243500 +0300
|
||||
@@ -418,6 +418,7 @@
|
||||
diff -urN a/src/w32-util.c b/src/w32-util.c
|
||||
--- a/src/w32-util.c 2015-08-04 22:35:23.525700800 +0100
|
||||
+++ b/src/w32-util.c 2015-08-04 22:35:24.087301800 +0100
|
||||
@@ -419,6 +419,7 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -25,7 +27,7 @@
|
||||
dir = read_w32_registry_string ("HKEY_LOCAL_MACHINE",
|
||||
"Software\\GNU\\GnuPG",
|
||||
"Install Directory");
|
||||
@@ -427,6 +428,7 @@
|
||||
@@ -428,6 +429,7 @@
|
||||
free (dir);
|
||||
return result;
|
||||
}
|
||||
@@ -33,7 +35,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -503,13 +505,15 @@
|
||||
@@ -504,13 +506,15 @@
|
||||
inst_dir = _gpgme_get_inst_dir ();
|
||||
gpg = find_program_in_inst_dir
|
||||
(inst_dir,
|
||||
@@ -51,7 +53,7 @@
|
||||
_gpgme_debug (DEBUG_ENGINE, "_gpgme_get_gpg_path: '%s' not found",
|
||||
name);
|
||||
}
|
||||
@@ -529,13 +533,15 @@
|
||||
@@ -530,13 +534,15 @@
|
||||
inst_dir = _gpgme_get_inst_dir ();
|
||||
gpgconf = find_program_in_inst_dir
|
||||
(inst_dir,
|
||||
@@ -69,7 +71,7 @@
|
||||
_gpgme_debug (DEBUG_ENGINE, "_gpgme_get_gpgconf_path: '%s' not found",
|
||||
name);
|
||||
}
|
||||
@@ -553,9 +559,11 @@
|
||||
@@ -554,9 +560,11 @@
|
||||
LOCK (get_path_lock);
|
||||
if (!w32spawn_program)
|
||||
w32spawn_program = find_program_in_inst_dir (inst_dir,"gpgme-w32spawn.exe");
|
||||
@@ -4,7 +4,7 @@
|
||||
_realname=gpgme
|
||||
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
|
||||
pkgver=1.5.5
|
||||
pkgrel=4
|
||||
pkgrel=5
|
||||
pkgdesc="A C wrapper library for GnuPG (mingw-w64)"
|
||||
arch=('any')
|
||||
url="http://www.gnupg.org/related_software/gpgme/"
|
||||
@@ -16,23 +16,23 @@ depends=("${MINGW_PACKAGE_PREFIX}-glib2"
|
||||
"${MINGW_PACKAGE_PREFIX}-npth"
|
||||
)
|
||||
options=('!emptydirs') # '!strip' 'debug')
|
||||
source=(ftp://ftp.gnupg.org/gcrypt/${_realname}/${_realname}-${pkgver}.tar.bz2{,.sig}
|
||||
gpgme-1.5.4-mingw-mkstemp.patch
|
||||
gpgme-find-gnupg.patch
|
||||
debugging-dont-DeleteFileA-tmpfiles.patch)
|
||||
source=(https://www.gnupg.org/ftp/gcrypt/${_realname}/${_realname}-${pkgver}.tar.bz2
|
||||
0001-fix-incorrect-fd-pointer-check.patch
|
||||
0002-reopen-mkstemp-files-without-_O_TEMPORARY.patch
|
||||
0003-mingw-mkstemp.patch
|
||||
0004-gpgme-find-gnupg.patch)
|
||||
sha1sums=('88476d72cb099e179de4040760502886f7a54926'
|
||||
'SKIP'
|
||||
'8c7d7648772c29620b7fd23e867f60386ba92790'
|
||||
'6dbd6f52c918facbe8fee5c5521ebad724ec9653'
|
||||
'305408eb39c03d72aab15029f85bd8d629b87a2c')
|
||||
'1828be3a0fcab854325295bc4a1d026b8d711d82'
|
||||
'6f70ede9db1c86f7e4d04ade0dc0aee720221ee9'
|
||||
'471223b20b8181dc6c09278901bb546434d46568'
|
||||
'e7d6fb6b1c99dd265eef363bce4ab2443662d383')
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}"/${_realname}-${pkgver}
|
||||
patch -p1 -i "${srcdir}"/gpgme-1.5.4-mingw-mkstemp.patch
|
||||
patch -p1 -i "${srcdir}"/gpgme-find-gnupg.patch
|
||||
if check_option "debug" "y"; then
|
||||
patch -p1 -i "${srcdir}"/debugging-dont-DeleteFileA-tmpfiles.patch
|
||||
fi
|
||||
patch -p1 -i "${srcdir}"/0001-fix-incorrect-fd-pointer-check.patch
|
||||
patch -p1 -i "${srcdir}"/0002-reopen-mkstemp-files-without-_O_TEMPORARY.patch
|
||||
patch -p1 -i "${srcdir}"/0003-mingw-mkstemp.patch
|
||||
patch -p1 -i "${srcdir}"/0004-gpgme-find-gnupg.patch
|
||||
|
||||
autoreconf -ivf
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
--- gpgme-1.5.5/src/w32-io.c.orig 2014-07-30 10:40:16.000000000 +0100
|
||||
+++ gpgme-1.5.5/src/w32-io.c 2015-08-04 00:27:52.274897800 +0100
|
||||
@@ -1587,7 +1587,7 @@
|
||||
if (!arg_string)
|
||||
{
|
||||
close (tmp_fd);
|
||||
- DeleteFileA (tmp_name);
|
||||
+/* DeleteFileA (tmp_name); */
|
||||
return TRACE_SYSRES (-1);
|
||||
}
|
||||
|
||||
@@ -1617,7 +1617,7 @@
|
||||
TRACE_LOG1 ("CreateProcess failed: ec=%d", (int) GetLastError ());
|
||||
free (arg_string);
|
||||
close (tmp_fd);
|
||||
- DeleteFileA (tmp_name);
|
||||
+/* DeleteFileA (tmp_name); */
|
||||
|
||||
/* FIXME: Should translate the error code. */
|
||||
gpg_err_set_errno (EIO);
|
||||
@@ -1652,7 +1652,7 @@
|
||||
CloseHandle (pi.hProcess);
|
||||
|
||||
close (tmp_fd);
|
||||
- DeleteFileA (tmp_name);
|
||||
+/* DeleteFileA (tmp_name); */
|
||||
|
||||
/* FIXME: Should translate the error code. */
|
||||
gpg_err_set_errno (EIO);
|
||||
Reference in New Issue
Block a user