commit 69b70e40e976e000fddeb4ba3ca9a3a6cd4681ea Author: CentOS Sources Date: Tue May 7 08:26:03 2019 -0400 import gpgme-1.10.0-6.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0da46a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gpgme-1.10.0.tar.bz2 diff --git a/.gpgme.metadata b/.gpgme.metadata new file mode 100644 index 0000000..2367c73 --- /dev/null +++ b/.gpgme.metadata @@ -0,0 +1 @@ +77d3390887da25ed70b7ac04392360efbdca501f SOURCES/gpgme-1.10.0.tar.bz2 diff --git a/SOURCES/0001-core-Tweak-STATUS_FAILURE-handling.patch b/SOURCES/0001-core-Tweak-STATUS_FAILURE-handling.patch new file mode 100644 index 0000000..080fde0 --- /dev/null +++ b/SOURCES/0001-core-Tweak-STATUS_FAILURE-handling.patch @@ -0,0 +1,47 @@ +From b99502274ae5efdf6df0d967900ec3d1e64373d7 Mon Sep 17 00:00:00 2001 +From: Werner Koch +Date: Thu, 12 Apr 2018 20:36:30 +0200 +Subject: [PATCH] core: Tweak STATUS_FAILURE handling. + +* src/op-support.c (_gpgme_parse_failure): Ignore failures with +location "gpg-exit". +* tests/gpg/t-verify.c (main): Adjust for the now working checking of +the second key. + +Signed-off-by: Werner Koch +--- + src/op-support.c | 10 +++++++++- + tests/gpg/t-verify.c | 8 +++++--- + 2 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/src/op-support.c b/src/op-support.c +index 43cb1c76..e55875f9 100644 +--- a/src/op-support.c ++++ b/src/op-support.c +@@ -400,7 +400,13 @@ _gpgme_parse_plaintext (char *args, char **filenamep) + + + /* Parse a FAILURE status line and return the error code. ARGS is +- modified to contain the location part. */ ++ * modified to contain the location part. Note that for now we ignore ++ * failure codes with a location of gpg-exit; they are too trouble ++ * some. Instead we should eventually record that error in the ++ * context and provide a function to return a fuller error ++ * description; this could then also show the location of the error ++ * (e.g. "option- parser") to make it easier for the user to detect ++ * the actual error. */ + gpgme_error_t + _gpgme_parse_failure (char *args) + { +@@ -418,6 +424,8 @@ _gpgme_parse_failure (char *args) + *where = '\0'; + + where = args; ++ if (!strcmp (where, "gpg-exit")) ++ return 0; + + return atoi (which); + } +-- +2.14.3 + diff --git a/SOURCES/0001-don-t-add-extra-libraries-for-linking.patch b/SOURCES/0001-don-t-add-extra-libraries-for-linking.patch new file mode 100644 index 0000000..39298db --- /dev/null +++ b/SOURCES/0001-don-t-add-extra-libraries-for-linking.patch @@ -0,0 +1,47 @@ +From 07a8ac908cbadb22c344895ebf9cc00c6a8fd3f7 Mon Sep 17 00:00:00 2001 +From: Igor Gnatenko +Date: Wed, 29 Mar 2017 07:05:41 +0200 +Subject: [PATCH] don't add extra libraries for linking + +Signed-off-by: Igor Gnatenko +--- + lang/cpp/src/GpgmeppConfig.cmake.in.in | 2 +- + src/gpgme-config.in | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/lang/cpp/src/GpgmeppConfig.cmake.in.in b/lang/cpp/src/GpgmeppConfig.cmake.in.in +index 73f5eaad..3104d715 100644 +--- a/lang/cpp/src/GpgmeppConfig.cmake.in.in ++++ b/lang/cpp/src/GpgmeppConfig.cmake.in.in +@@ -63,7 +63,7 @@ add_library(Gpgmepp SHARED IMPORTED) + + set_target_properties(Gpgmepp PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "@resolved_includedir@/gpgme++;@resolved_includedir@" +- INTERFACE_LINK_LIBRARIES "pthread;@resolved_libdir@/libgpgme@libsuffix@;@LIBASSUAN_LIBS@" ++ INTERFACE_LINK_LIBRARIES "pthread;@resolved_libdir@/libgpgme@libsuffix@" + IMPORTED_LOCATION "@resolved_libdir@/libgpgmepp@libsuffix@" + ) + +diff --git a/src/gpgme-config.in b/src/gpgme-config.in +index a4d152e1..6a854e4a 100644 +--- a/src/gpgme-config.in ++++ b/src/gpgme-config.in +@@ -22,12 +22,12 @@ cflags="-I@includedir@" + libs="-L@libdir@" + + # Network libraries. +-assuan_cflags="@LIBASSUAN_CFLAGS@" +-assuan_libs="@LIBASSUAN_LIBS@" ++#assuan_cflags="@LIBASSUAN_CFLAGS@" ++#assuan_libs="@LIBASSUAN_LIBS@" + + # Configure libgpg-error. + gpg_error_cflags="@GPG_ERROR_CFLAGS@" +-gpg_error_libs="@GPG_ERROR_LIBS@" ++#gpg_error_libs="@GPG_ERROR_LIBS@" + + # Configure thread packages. + thread_modules="" +-- +2.15.1 + diff --git a/SOURCES/0001-fix-stupid-ax_python_devel.patch b/SOURCES/0001-fix-stupid-ax_python_devel.patch new file mode 100644 index 0000000..40cf7df --- /dev/null +++ b/SOURCES/0001-fix-stupid-ax_python_devel.patch @@ -0,0 +1,27 @@ +From b0eabea4b1232ee7f45d13b8add928d463f37444 Mon Sep 17 00:00:00 2001 +From: Igor Gnatenko +Date: Wed, 29 Mar 2017 07:13:35 +0200 +Subject: [PATCH] fix stupid ax_python_devel + +References: https://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=commit;h=883a2abd5af5c96be894d5ef7ee6e9a2b8e64307 +Signed-off-by: Igor Gnatenko +--- + m4/ax_python_devel.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/m4/ax_python_devel.m4 b/m4/ax_python_devel.m4 +index b990d5b3..318b089c 100644 +--- a/m4/ax_python_devel.m4 ++++ b/m4/ax_python_devel.m4 +@@ -137,7 +137,7 @@ variable to configure. See ``configure --help'' for reference. + # + AC_MSG_CHECKING([for the distutils Python package]) + ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` +- if test -z "$ac_distutils_result"; then ++ if test $? -eq 0; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +-- +2.12.1 + diff --git a/SOURCES/gpgme-1.10.0-fix-resource-leaks.patch b/SOURCES/gpgme-1.10.0-fix-resource-leaks.patch new file mode 100644 index 0000000..6bbbd78 --- /dev/null +++ b/SOURCES/gpgme-1.10.0-fix-resource-leaks.patch @@ -0,0 +1,901 @@ +diff -Naur a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp +--- a/lang/cpp/src/context.cpp 2018-11-12 13:57:39.922527452 +0100 ++++ b/lang/cpp/src/context.cpp 2018-11-14 13:22:37.402101541 +0100 +@@ -222,6 +222,7 @@ + } + break; + default: ++ gpgme_release(ctx); + return 0; + } + +@@ -267,6 +268,7 @@ + } + break; + default: ++ gpgme_release(ctx); + if (error) { + *error = Error::fromCode(GPG_ERR_INV_ARG); + } +diff -Naur a/lang/cpp/src/data.cpp b/lang/cpp/src/data.cpp +--- a/lang/cpp/src/data.cpp 2018-11-12 13:57:39.925527381 +0100 ++++ b/lang/cpp/src/data.cpp 2018-11-14 13:29:09.167961419 +0100 +@@ -244,6 +244,7 @@ + } + + if (gpgme_op_keylist_from_data_start (ctx->impl()->ctx, d->data, 0)) { ++ delete ctx; + return ret; + } + +diff -Naur a/lang/python/gpgme.i b/lang/python/gpgme.i +--- a/lang/python/gpgme.i 2018-11-12 13:57:39.842529333 +0100 ++++ b/lang/python/gpgme.i 2018-11-14 13:04:00.404376027 +0100 +@@ -43,7 +43,7 @@ + { + encodedInput = PyUnicode_AsUTF8String($input); + if (encodedInput == NULL) +- return NULL; ++ SWIG_fail; + $1 = PyBytes_AsString(encodedInput); + } + else if (PyBytes_Check($input)) +@@ -52,22 +52,25 @@ + PyErr_Format(PyExc_TypeError, + "arg %d: expected str, bytes, or None, got %s", + $argnum, $input->ob_type->tp_name); +- return NULL; ++ SWIG_fail; + } + } + %typemap(freearg) const char * { + Py_XDECREF(encodedInput$argnum); + } + ++%typemap(arginit) const char *[] { ++ $1 = NULL; ++} ++ + /* Likewise for a list of strings. */ +-%typemap(in) const char *[] (void *vector = NULL, +- size_t size, ++%typemap(in) const char *[] (size_t size, + PyObject **pyVector = NULL) { + /* Check if is a list */ + if (PyList_Check($input)) { + size_t i, j; + size = PyList_Size($input); +- $1 = (char **) (vector = malloc((size+1) * sizeof(char *))); ++ $1 = (char **) malloc((size+1) * sizeof(char *)); + pyVector = calloc(sizeof *pyVector, size); + + for (i = 0; i < size; i++) { +@@ -76,12 +79,7 @@ + { + pyVector[i] = PyUnicode_AsUTF8String(o); + if (pyVector[i] == NULL) +- { +- free(vector); +- for (j = 0; j < i; j++) +- Py_XDECREF(pyVector[j]); +- return NULL; +- } ++ SWIG_fail; + $1[i] = PyBytes_AsString(pyVector[i]); + } + else if (PyString_Check(o)) +@@ -91,8 +89,7 @@ + "arg %d: list must contain only str or bytes, got %s " + "at position %d", + $argnum, o->ob_type->tp_name, i); +- free($1); +- return NULL; ++ SWIG_fail; + } + } + $1[i] = NULL; +@@ -100,14 +97,17 @@ + PyErr_Format(PyExc_TypeError, + "arg %d: expected a list of str or bytes, got %s", + $argnum, $input->ob_type->tp_name); +- return NULL; ++ SWIG_fail; + } + } + %typemap(freearg) const char *[] { +- size_t i; +- free(vector$argnum); +- for (i = 0; i < size$argnum; i++) +- Py_XDECREF(pyVector$argnum[i]); ++ if (pyVector$argnum) { ++ size_t i; ++ for (i = 0; i < size$argnum; i++) ++ Py_XDECREF(pyVector$argnum[i]); ++ free(pyVector$argnum); ++ } ++ if ($1) free($1); + } + + /* Release returned buffers as necessary. */ +@@ -125,7 +125,7 @@ + if (!PySequence_Check($input)) { + PyErr_Format(PyExc_ValueError, "arg %d: Expected a list of gpgme_key_t", + $argnum); +- return NULL; ++ SWIG_fail; + } + if((numb = PySequence_Length($input)) != 0) { + $1 = (gpgme_key_t*)malloc((numb+1)*sizeof(gpgme_key_t)); +@@ -142,8 +142,7 @@ + "arg %d: list must contain only gpgme_key_ts, got %s " + "at position %d", + $argnum, pypointer->ob_type->tp_name, i); +- free($1); +- return NULL; ++ SWIG_fail; + } + Py_DECREF(pypointer); + } +@@ -169,7 +168,7 @@ + pypointer = _gpg_obj2gpgme_data_t($input, $argnum, &wrapper, + &bytesio, &view); + if (pypointer == NULL) +- return NULL; ++ SWIG_fail; + have_view = !! view.obj; + + /* input = $input, 1 = $1, 1_descriptor = $1_descriptor */ +@@ -179,7 +178,7 @@ + if ((SWIG_ConvertPtr(pypointer,(void **) &$1, $1_descriptor, + SWIG_POINTER_EXCEPTION | $disown )) == -1) { + Py_DECREF(pypointer); +- return NULL; ++ SWIG_fail; + } + Py_DECREF(pypointer); + } +@@ -336,6 +335,11 @@ + PyErr_SetString(PyExc_TypeError, "Numeric argument expected"); + } + ++%typemap(arginit) (void *buffer, size_t size), (char *buf, size_t buflen) { ++ $1 = NULL; ++ $2 = 0; ++} ++ + /* Those are for gpgme_data_read() and gpgme_strerror_r(). */ + %typemap(in) (void *buffer, size_t size), (char *buf, size_t buflen) { + { +@@ -349,12 +353,12 @@ + else + { + PyErr_SetString(PyExc_TypeError, "Numeric argument expected"); +- return NULL; ++ SWIG_fail; + } + + if (tmp$argnum < 0) { + PyErr_SetString(PyExc_ValueError, "Positive integer expected"); +- return NULL; ++ SWIG_fail; + } + $2 = (size_t) tmp$argnum; + $1 = ($1_ltype) malloc($2+1); +@@ -363,11 +367,11 @@ + %typemap(argout) (void *buffer, size_t size), (char *buf, size_t buflen) { + Py_XDECREF($result); /* Blow away any previous result */ + if (result < 0) { /* Check for I/O error */ +- free($1); ++ if ($1) free($1); + return PyErr_SetFromErrno(PyExc_RuntimeError); + } + $result = PyBytes_FromStringAndSize($1,result); +- free($1); ++ if ($1) free($1); + } + + /* For gpgme_data_write, but should be universal. */ +@@ -380,11 +384,11 @@ + { + encodedInput = PyUnicode_AsUTF8String($input); + if (encodedInput == NULL) +- return NULL; ++ SWIG_fail; + if (PyBytes_AsStringAndSize(encodedInput, (char **) &$1, &ssize) == -1) + { + Py_DECREF(encodedInput); +- return NULL; ++ SWIG_fail; + } + } + else if (PyBytes_Check($input)) +@@ -393,7 +397,7 @@ + PyErr_Format(PyExc_TypeError, + "arg %d: expected str, bytes, or None, got %s", + $argnum, $input->ob_type->tp_name); +- return NULL; ++ SWIG_fail; + } + + if (! $1) +@@ -422,8 +426,17 @@ + size++; + } + $result = PyList_New(size); ++ if ($result == NULL) ++ SWIG_fail; + for (i=0,curr=$1; inext) { + PyObject *o = SWIG_NewPointerObj(SWIG_as_voidptr(curr), $1_descriptor, %newpointer_flags); ++ if (o == NULL) { ++ int j; ++ for (j = 0; j < i; j++) ++ Py_XDECREF(PyList_GetItem($result, j)); ++ Py_DECREF($result); ++ SWIG_fail; ++ } + PyList_SetItem($result, i, o); + } + } +@@ -436,6 +449,8 @@ + PyObject *fragile; + fragile = SWIG_NewPointerObj(SWIG_as_voidptr($1), $1_descriptor, + %newpointer_flags); ++ if (fragile == NULL) ++ SWIG_fail; + $result = _gpg_wrap_result(fragile, name); + Py_DECREF(fragile); + } +@@ -459,22 +474,28 @@ + } + $result = PyList_New(size); + if ($result == NULL) +- return NULL; /* raise */ ++ SWIG_fail; /* raise */ + for (i=0,curr=$1; inext) { + PyObject *fragile, *o; + fragile = SWIG_NewPointerObj(SWIG_as_voidptr(curr), $1_descriptor, + %newpointer_flags); + if (fragile == NULL) + { ++ int j; ++ for (j = 0; j < i; j++) ++ Py_XDECREF(PyList_GetItem($result, j)); + Py_DECREF($result); +- return NULL; /* raise */ ++ SWIG_fail; /* raise */ + } + o = _gpg_wrap_result(fragile, "EngineInfo"); + Py_DECREF(fragile); + if (o == NULL) + { ++ int j; ++ for (j = 0; j < i; j++) ++ Py_XDECREF(PyList_GetItem($result, j)); + Py_DECREF($result); +- return NULL; /* raise */ ++ SWIG_fail; /* raise */ + } + PyList_SetItem($result, i, o); + } +diff -Naur a/lang/qt/tests/t-various.cpp b/lang/qt/tests/t-various.cpp +--- a/lang/qt/tests/t-various.cpp 2018-11-12 13:57:39.907527804 +0100 ++++ b/lang/qt/tests/t-various.cpp 2018-11-14 15:22:25.475304073 +0100 +@@ -34,6 +34,7 @@ + #include "config.h" + #endif + ++#include + #include + #include + #include +@@ -103,27 +104,30 @@ + if (GpgME::engineInfo(GpgME::GpgEngine).engineVersion() < "2.1.13") { + return; + } +- KeyListJob *job = openpgp()->keyListJob(false, true, true); + std::vector keys; +- GpgME::KeyListResult result = job->exec(QStringList() << QStringLiteral("alfa@example.net"), +- false, keys); +- delete job; +- QVERIFY (!result.error()); +- QVERIFY (keys.size() == 1); ++ { ++ QScopedPointer job(openpgp()->keyListJob(false, true, true)); ++ QVERIFY(!job.isNull()); ++ GpgME::KeyListResult result = job->exec(QStringList() << QStringLiteral("alfa@example.net"), ++ false, keys); ++ QVERIFY (!result.error()); ++ QVERIFY (keys.size() == 1); ++ } + Key key = keys.front(); + + QVERIFY (key.numUserIDs() == 3); + const char uid[] = "Foo Bar (with comment) "; + +- auto ctx = Context::createForProtocol(key.protocol()); +- QVERIFY (ctx); +- TestPassphraseProvider provider; +- ctx->setPassphraseProvider(&provider); +- ctx->setPinentryMode(Context::PinentryLoopback); +- +- QVERIFY(!ctx->addUid(key, uid)); +- delete ctx; +- key.update(); ++ { ++ QScopedPointer ctx(Context::createForProtocol(key.protocol())); ++ QVERIFY (!ctx.isNull()); ++ TestPassphraseProvider provider; ++ ctx->setPassphraseProvider(&provider); ++ ctx->setPinentryMode(Context::PinentryLoopback); ++ ++ QVERIFY(!ctx->addUid(key, uid)); ++ key.update(); ++ } + + QVERIFY (key.numUserIDs() == 4); + bool id_found = false;; +@@ -136,10 +140,12 @@ + } + QVERIFY (id_found); + +- ctx = Context::createForProtocol(key.protocol()); +- QVERIFY (!ctx->revUid(key, uid)); +- delete ctx; +- key.update(); ++ { ++ QScopedPointer ctx(Context::createForProtocol(key.protocol())); ++ QVERIFY (!ctx.isNull()); ++ QVERIFY (!ctx->revUid(key, uid)); ++ key.update(); ++ } + + bool id_revoked = false;; + for (const auto &u: key.userIDs()) { +diff -Naur a/src/engine.c b/src/engine.c +--- a/src/engine.c 2018-11-12 13:57:40.081523713 +0100 ++++ b/src/engine.c 2018-11-15 15:14:49.518729792 +0100 +@@ -459,7 +459,9 @@ + if (!new_version) + { + free (new_file_name); +- free (new_home_dir); ++ if (new_home_dir) ++ free (new_home_dir); ++ return gpg_error_from_syserror (); + } + } + +diff -Naur a/src/engine-gpg.c b/src/engine-gpg.c +--- a/src/engine-gpg.c 2018-11-12 13:57:40.083523666 +0100 ++++ b/src/engine-gpg.c 2018-11-15 14:55:35.374077739 +0100 +@@ -968,7 +968,7 @@ + == -1) + { + int saved_errno = errno; +- free (fd_data_map); ++ free_fd_data_map (fd_data_map); + free_argv (argv); + return gpg_error (saved_errno); + } +@@ -978,10 +978,10 @@ + close_notify_handler, + gpg)) + { +- /* We leak fd_data_map and the fds. This is not easy +- to avoid and given that we reach this here only +- after a malloc failure for a small object, it is +- probably better not to do anything. */ ++ close (fds[0]); ++ close (fds[1]); ++ free_fd_data_map (fd_data_map); ++ free_argv (argv); + return gpg_error (GPG_ERR_GENERAL); + } + /* If the data_type is FD, we have to do a dup2 here. */ +@@ -1024,7 +1024,7 @@ + if (!argv[argc]) + { + int saved_err = gpg_error_from_syserror (); +- free (fd_data_map); ++ free_fd_data_map (fd_data_map); + free_argv (argv); + return saved_err; + } +@@ -1049,7 +1049,7 @@ + if (!argv[argc]) + { + int saved_err = gpg_error_from_syserror (); +- free (fd_data_map); ++ free_fd_data_map (fd_data_map); + free_argv (argv); + return saved_err; + } +@@ -1104,6 +1104,9 @@ + buffer = realloc (buffer, bufsize); + if (!buffer) + return gpg_error_from_syserror (); ++ /* Update buffer and bufsize here to prevent memory leaks. */ ++ gpg->status.buffer = buffer; ++ gpg->status.bufsize = bufsize; + } + + nread = _gpgme_io_read (gpg->status.fd[0], +@@ -1254,8 +1257,6 @@ + } + + /* Update the gpg object. */ +- gpg->status.bufsize = bufsize; +- gpg->status.buffer = buffer; + gpg->status.readpos = readpos; + return 0; + } +@@ -1295,6 +1296,9 @@ + buffer = realloc (buffer, bufsize); + if (!buffer) + return gpg_error_from_syserror (); ++ /* Prevent memory leaks. */ ++ gpg->colon.buffer = buffer; ++ gpg->colon.bufsize = bufsize; + } + + nread = _gpgme_io_read (gpg->colon.fd[0], buffer+readpos, bufsize-readpos); +@@ -1374,8 +1378,6 @@ + } + + /* Update the gpg object. */ +- gpg->colon.bufsize = bufsize; +- gpg->colon.buffer = buffer; + gpg->colon.readpos = readpos; + return 0; + } +diff -Naur a/src/engine-gpgsm.c b/src/engine-gpgsm.c +--- a/src/engine-gpgsm.c 2018-11-12 13:57:40.083523666 +0100 ++++ b/src/engine-gpgsm.c 2018-11-15 15:03:09.798301245 +0100 +@@ -1366,8 +1366,10 @@ + gpgsm->output_cb.data = keydata; + err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor" + : map_data_enc (gpgsm->output_cb.data)); +- if (err) ++ if (err) { ++ free (cmd); + return err; ++ } + gpgsm_clear_fd (gpgsm, INPUT_FD); + gpgsm_clear_fd (gpgsm, MESSAGE_FD); + gpgsm->inline_data = NULL; +@@ -1467,8 +1469,10 @@ + gpgsm->output_cb.data = keydata; + err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor" + : map_data_enc (gpgsm->output_cb.data)); +- if (err) ++ if (err) { ++ free (line); + return err; ++ } + gpgsm_clear_fd (gpgsm, INPUT_FD); + gpgsm_clear_fd (gpgsm, MESSAGE_FD); + gpgsm->inline_data = NULL; +diff -Naur a/src/gpgme-tool.c b/src/gpgme-tool.c +--- a/src/gpgme-tool.c 2018-11-12 13:57:40.084523642 +0100 ++++ b/src/gpgme-tool.c 2018-11-15 22:02:04.913188338 +0100 +@@ -2330,8 +2330,8 @@ + char *inp_fn; + assuan_fd_t out_fd; + char *out_fn; +- gpgme_data_t inp_data; +- gpgme_data_t out_data; ++ gpgme_data_t inp_data = NULL; ++ gpgme_data_t out_data = NULL; + + (void)line; + +@@ -2346,13 +2346,18 @@ + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data, + &server->output_stream); + if (err) + { + gpgme_data_release (inp_data); ++ if (out_data) ++ gpgme_data_release (out_data); + return err; + } + +@@ -2425,8 +2430,11 @@ + { + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + } + if (out_fd != ASSUAN_INVALID_FD || out_fn) + { +@@ -2435,6 +2443,8 @@ + if (err) + { + gpgme_data_release (inp_data); ++ if (out_data) ++ gpgme_data_release (out_data); + return err; + } + } +@@ -2499,8 +2509,8 @@ + char *inp_fn; + assuan_fd_t out_fd; + char *out_fn; +- gpgme_data_t inp_data; +- gpgme_data_t out_data; ++ gpgme_data_t inp_data = NULL; ++ gpgme_data_t out_data = NULL; + gpgme_sig_mode_t mode = GPGME_SIG_MODE_NORMAL; + + if (strstr (line, "--clear")) +@@ -2519,13 +2529,18 @@ + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data, + &server->output_stream); + if (err) + { + gpgme_data_release (inp_data); ++ if (out_data) ++ gpgme_data_release (out_data); + return err; + } + +@@ -2557,7 +2572,7 @@ + char *inp_fn; + char *msg_fn; + char *out_fn; +- gpgme_data_t inp_data; ++ gpgme_data_t inp_data = NULL; + gpgme_data_t msg_data = NULL; + gpgme_data_t out_data = NULL; + +@@ -2574,8 +2589,11 @@ + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + if (msg_fd != ASSUAN_INVALID_FD || msg_fn) + { + err = server_data_obj (msg_fd, msg_fn, 0, server->message_enc, &msg_data, +@@ -2583,6 +2601,8 @@ + if (err) + { + gpgme_data_release (inp_data); ++ if (msg_data) ++ gpgme_data_release (msg_data); + return err; + } + } +@@ -2594,6 +2614,8 @@ + { + gpgme_data_release (inp_data); + gpgme_data_release (msg_data); ++ if (out_data) ++ gpgme_data_release (out_data); + return err; + } + } +@@ -2634,7 +2656,7 @@ + gpg_error_t err; + assuan_fd_t inp_fd; + char *inp_fn; +- gpgme_data_t inp_data; ++ gpgme_data_t inp_data = NULL; + + inp_fd = server->input_fd; + inp_fn = server->input_filename; +@@ -2643,8 +2665,11 @@ + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + + err = gt_import (server->gt, inp_data); + +@@ -2668,7 +2693,7 @@ + gpg_error_t err; + assuan_fd_t out_fd; + char *out_fn; +- gpgme_data_t out_data; ++ gpgme_data_t out_data = NULL; + gpgme_export_mode_t mode = 0; + const char *pattern[2]; + +@@ -2678,8 +2703,11 @@ + return GPG_ERR_ASS_NO_OUTPUT; + err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data, + &server->output_stream); +- if (err) ++ if (err) { ++ if (out_data) ++ gpgme_data_release (out_data); + return err; ++ } + + if (has_option (line, "--extern")) + mode |= GPGME_EXPORT_MODE_EXTERN; +@@ -2733,7 +2761,7 @@ + char *inp_fn; + assuan_fd_t out_fd; + char *out_fn; +- gpgme_data_t inp_data; ++ gpgme_data_t inp_data = NULL; + gpgme_data_t out_data = NULL; + gpgme_data_t parms_data = NULL; + const char *parms; +@@ -2749,8 +2777,11 @@ + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + if (out_fd != ASSUAN_INVALID_FD || out_fn) + { + err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data, +@@ -2758,6 +2789,8 @@ + if (err) + { + gpgme_data_release (inp_data); ++ if (out_data) ++ gpgme_data_release (out_data); + return err; + } + } +@@ -2795,6 +2828,7 @@ + } + + err = gt_genkey (server->gt, parms, out_data, NULL); ++ free (parms); + + server_reset_fds (server); + +@@ -2968,7 +3002,7 @@ + gpg_error_t err; + assuan_fd_t out_fd; + char *out_fn; +- gpgme_data_t out_data; ++ gpgme_data_t out_data = NULL; + unsigned int flags = 0; + + out_fd = server->output_fd; +@@ -2977,8 +3011,11 @@ + return GPG_ERR_ASS_NO_OUTPUT; + err = server_data_obj (out_fd, out_fn, 1, server->output_enc, &out_data, + &server->output_stream); +- if (err) ++ if (err) { ++ if (out_data) ++ gpgme_data_release (out_data); + return err; ++ } + + if (strstr (line, "--html")) + flags |= GPGME_AUDITLOG_HTML; +@@ -3111,7 +3148,7 @@ + gpg_error_t err; + assuan_fd_t inp_fd; + char *inp_fn; +- gpgme_data_t inp_data; ++ gpgme_data_t inp_data = NULL; + + (void)line; + +@@ -3122,8 +3159,11 @@ + + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + + err = gt_identify (server->gt, inp_data); + +@@ -3159,8 +3199,11 @@ + { + err = server_data_obj (inp_fd, inp_fn, 0, server->input_enc, &inp_data, + &server->input_stream); +- if (err) ++ if (err) { ++ if (inp_data) ++ gpgme_data_release (inp_data); + return err; ++ } + } + if (out_fd != ASSUAN_INVALID_FD || out_fn) + { +@@ -3169,6 +3212,8 @@ + if (err) + { + gpgme_data_release (inp_data); ++ if (out_data) ++ gpgme_data_release (out_data); + return err; + } + } +diff -Naur a/tests/gpg/t-import.c b/tests/gpg/t-import.c +--- a/tests/gpg/t-import.c 2018-11-12 13:57:39.808530132 +0100 ++++ b/tests/gpg/t-import.c 2018-11-16 12:52:09.829248570 +0100 +@@ -212,7 +212,7 @@ + { + gpgme_ctx_t ctx; + gpgme_error_t err; +- gpgme_data_t in; ++ gpgme_data_t in = NULL; + gpgme_import_result_t result; + char *pubkey_1_asc = make_filename ("pubkey-1.asc"); + char *seckey_1_asc = make_filename ("seckey-1.asc"); +@@ -235,6 +235,7 @@ + check_result (result, "ADAB7FCC1F4DE2616ECFA402AF82244F9CD9FD55", 0); + gpgme_data_release (in); + ++ in = NULL; /* Make Coverity happy. */ + err = gpgme_data_new_from_file (&in, seckey_1_asc, 1); + free (seckey_1_asc); + fail_if_err (err); +diff -Naur a/tests/gpg/t-trustlist.c b/tests/gpg/t-trustlist.c +--- a/tests/gpg/t-trustlist.c 2018-11-12 13:57:39.810530085 +0100 ++++ b/tests/gpg/t-trustlist.c 2018-11-16 12:52:09.837248378 +0100 +@@ -39,7 +39,7 @@ + { + gpgme_ctx_t ctx; + gpgme_error_t err; +- gpgme_trust_item_t item; ++ gpgme_trust_item_t item = NULL; + + (void)argc; + (void)argv; +@@ -58,6 +58,7 @@ + item->level, item->keyid, item->type, item->owner_trust, + item->validity, item->name); + gpgme_trust_item_unref (item); ++ item = NULL; /* Make Coverity happy. */ + } + if (gpgme_err_code (err) != GPG_ERR_EOF) + fail_if_err (err); +diff -Naur a/tests/gpgsm/cms-keylist.c b/tests/gpgsm/cms-keylist.c +--- a/tests/gpgsm/cms-keylist.c 2018-11-12 13:57:39.830529615 +0100 ++++ b/tests/gpgsm/cms-keylist.c 2018-11-16 12:52:09.842248259 +0100 +@@ -45,7 +45,7 @@ + { + gpgme_error_t err; + gpgme_ctx_t ctx; +- gpgme_key_t key; ++ gpgme_key_t key = NULL; + gpgme_keylist_result_t result; + + if (argc) +@@ -107,6 +107,7 @@ + putchar ('\n'); + + gpgme_key_unref (key); ++ key = NULL; /* Make Coverity happy. */ + } + if (gpgme_err_code (err) != GPG_ERR_EOF) + fail_if_err (err); +diff -Naur a/tests/gpgsm/t-import.c b/tests/gpgsm/t-import.c +--- a/tests/gpgsm/t-import.c 2018-11-12 13:57:39.829529639 +0100 ++++ b/tests/gpgsm/t-import.c 2018-11-16 12:52:07.932293971 +0100 +@@ -142,7 +142,7 @@ + { + gpgme_ctx_t ctx; + gpgme_error_t err; +- gpgme_data_t in; ++ gpgme_data_t in = NULL; + gpgme_import_result_t result; + char *cert_1 = make_filename ("cert_dfn_pca01.der"); + char *cert_2 = make_filename ("cert_dfn_pca15.der"); +@@ -164,6 +164,7 @@ + check_result (result, "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD", 1, 1); + gpgme_data_release (in); + ++ in = NULL; /* Make Coverity happy. */ + err = gpgme_data_new_from_file (&in, cert_2, 1); + free (cert_2); + fail_if_err (err); +diff -Naur a/tests/gpgsm/t-keylist.c b/tests/gpgsm/t-keylist.c +--- a/tests/gpgsm/t-keylist.c 2018-11-12 13:57:39.829529639 +0100 ++++ b/tests/gpgsm/t-keylist.c 2018-11-16 13:20:51.685124686 +0100 +@@ -85,7 +85,7 @@ + { + gpgme_error_t err; + gpgme_ctx_t ctx; +- gpgme_key_t key; ++ gpgme_key_t key = NULL; + gpgme_keylist_result_t result; + int i = 0; + +@@ -111,6 +111,7 @@ + fprintf (stderr, "Warning: Skipping unknown key %s\n", + key->subkeys->fpr); + gpgme_key_unref (key); ++ key = NULL; /* Make Coverity happy. */ + continue; + } + else +@@ -365,6 +366,7 @@ + + + gpgme_key_unref (key); ++ key = NULL; /* Make Coverity happy. */ + i++; + } + if (gpgme_err_code (err) != GPG_ERR_EOF) +diff -Naur a/tests/run-identify.c b/tests/run-identify.c +--- a/tests/run-identify.c 2018-11-12 13:57:39.806530179 +0100 ++++ b/tests/run-identify.c 2018-11-16 12:59:06.391278677 +0100 +@@ -77,7 +77,7 @@ + int last_argc = -1; + gpgme_error_t err; + int anyerr = 0; +- gpgme_data_t data; ++ gpgme_data_t data = NULL; + gpgme_data_type_t dt; + + if (argc) +@@ -122,6 +122,7 @@ + anyerr = 1; + printf ("%s: %s\n", *argv, data_type_to_string (dt)); + gpgme_data_release (data); ++ data = NULL; /* Make Coverity happy. */ + } + } + +diff -Naur a/tests/run-import.c b/tests/run-import.c +--- a/tests/run-import.c 2018-11-12 13:57:39.833529545 +0100 ++++ b/tests/run-import.c 2018-11-16 13:00:30.184273195 +0100 +@@ -58,7 +58,7 @@ + int url_mode = 0; + int nul_mode = 0; + gpgme_import_result_t impres; +- gpgme_data_t data; ++ gpgme_data_t data = NULL; + + if (argc) + { argc--; argv++; } +@@ -122,6 +122,7 @@ + print_import_result (impres); + + gpgme_data_release (data); ++ data = NULL; /* Make Coverity happy. */ + } + + gpgme_release (ctx); diff --git a/SOURCES/gpgme-1.3.2-largefile.patch b/SOURCES/gpgme-1.3.2-largefile.patch new file mode 100644 index 0000000..bbf88de --- /dev/null +++ b/SOURCES/gpgme-1.3.2-largefile.patch @@ -0,0 +1,24 @@ +diff -up gpgme-1.3.2/src/gpgme-config.in.largefile gpgme-1.3.2/src/gpgme-config.in +--- gpgme-1.3.2/src/gpgme-config.in.largefile 2012-09-26 10:10:37.882744198 +0200 ++++ gpgme-1.3.2/src/gpgme-config.in 2012-09-26 10:16:02.558762827 +0200 +@@ -41,6 +41,10 @@ cflags_pthread="" + cflags_glib="@GLIB_CFLAGS@" + with_glib= + ++if test "0@NEED__FILE_OFFSET_BITS@" -gt "0" ; then ++ cflags_lfs="-D_FILE_OFFSET_BITS=@NEED__FILE_OFFSET_BITS@" ++fi ++ + output="" + + usage() +@@ -105,6 +109,9 @@ while test $# -gt 0; do + exit 0 + ;; + --cflags) ++ if test "x$cflags_lfs" != "x"; then ++ output="$output $cflags_lfs" ++ fi + result= + tmp_c= + tmp_g= diff --git a/SOURCES/gpgme-multilib.h b/SOURCES/gpgme-multilib.h new file mode 100644 index 0000000..574f09d --- /dev/null +++ b/SOURCES/gpgme-multilib.h @@ -0,0 +1,20 @@ +/* gpgme-multilib.h */ +/* This file is here to prevent a file conflict on multiarch systems. A + * conflict will occur because gpgme.h has arch-specific definitions. + * + * DO NOT INCLUDE THE NEW FILE DIRECTLY -- ALWAYS INCLUDE THIS ONE INSTEAD. */ + +#ifndef GPGME_MULTILIB_H +#define GPGME_MULTILIB_H +#include + +#if __WORDSIZE == 32 +#include "gpgme-32.h" +#elif __WORDSIZE == 64 +#include "gpgme-64.h" +#else +#error "unexpected value for __WORDSIZE macro" +#endif + +#endif + diff --git a/SPECS/gpgme.spec b/SPECS/gpgme.spec new file mode 100644 index 0000000..4e6dc49 --- /dev/null +++ b/SPECS/gpgme.spec @@ -0,0 +1,566 @@ +%bcond_without check + +%if 0%{?rhel} > 7 +# Disable python2 build by default +%bcond_with python2 +%else +%bcond_without python2 +%endif + +# trim changelog included in binary rpms +%global _changelog_trimtime %(date +%s -d "1 year ago") + +# STATUS_KEY_CONSIDERED has been added in 2.1.13 +%global gnupg2_min_ver 2.1.13 +# GPG_ERR_SUBKEYS_EXP_OR_REV has been added in 1.23 +%global libgpg_error_min_ver 1.23 + +Name: gpgme +Summary: GnuPG Made Easy - high level crypto API +Version: 1.10.0 +Release: 6%{?dist} + +License: LGPLv2+ +URL: https://gnupg.org/related_software/gpgme/ +Source0: ftp://ftp.gnupg.org/gcrypt/gpgme/gpgme-%{version}.tar.bz2 +Source2: gpgme-multilib.h + +## upstream patches +# https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gpgme.git;a=commit;h=b99502274ae5efdf6df0d967900ec3d1e64373d7 +Patch1000: 0001-core-Tweak-STATUS_FAILURE-handling.patch + +## downstream patches +# Don't add extra libs/cflags in gpgme-config/cmake equivalent +Patch1001: 0001-don-t-add-extra-libraries-for-linking.patch +# add -D_FILE_OFFSET_BITS... to gpgme-config, upstreamable +Patch1002: gpgme-1.3.2-largefile.patch +# Let's fix stupid AX_PYTHON_DEVEL +Patch1003: 0001-fix-stupid-ax_python_devel.patch +# Fix resource leaks discovered by static code analyzer +Patch1004: gpgme-1.10.0-fix-resource-leaks.patch + +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: gawk +BuildRequires: gnupg2 >= %{gnupg2_min_ver} +BuildRequires: gnupg2-smime +BuildRequires: libgpg-error-devel >= %{libgpg_error_min_ver} +BuildRequires: libassuan-devel >= 2.0.2 + +# For python bindings +BuildRequires: swig + +# to remove RPATH +BuildRequires: chrpath + +# For AutoReq cmake-filesystem +BuildRequires: cmake + +Requires: gnupg2 >= %{gnupg2_min_ver} + +# On the following architectures workaround multiarch conflict of -devel packages: +%define multilib_arches %{ix86} x86_64 ia64 ppc ppc64 s390 s390x %{sparc} + +%description +GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG +easier for applications. It provides a high-level crypto API for +encryption, decryption, signing, signature verification and key +management. + +%package devel +Summary: Development headers and libraries for %{name} +Requires: %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires: libgpg-error-devel%{?_isa} >= %{libgpg_error_min_ver} +Requires(post): /sbin/install-info +Requires(postun): /sbin/install-info + +%description devel +%{summary}. + +%package -n %{name}pp +Summary: C++ bindings/wrapper for GPGME +Obsoletes: gpgme-pp < 1.8.0-7 +Provides: gpgme-pp = %{?epoch:%{epoch}:}%{version}-%{release} +Provides: gpgme-pp%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires: %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} + +%description -n %{name}pp +%{summary}. + +%package -n %{name}pp-devel +Summary: Development libraries and header files for %{name}-pp +Obsoletes: gpgme-pp-devel < 1.8.0-7 +Provides: gpgme-pp-devel = %{?epoch:%{epoch}:}%{version}-%{release} +Provides: gpgme-pp-devel%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires: %{name}pp%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires: %{name}-devel%{?_isa} +# For automatic provides +BuildRequires: cmake + +%description -n %{name}pp-devel +%{summary} + +%package -n q%{name} +Summary: Qt API bindings/wrapper for GPGME +Requires: %{name}pp%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +BuildRequires: pkgconfig(Qt5Core) +BuildRequires: pkgconfig(Qt5Test) + +%description -n q%{name} +%{summary}. + +%package -n q%{name}-devel +Summary: Development libraries and header files for %{name} +# before libqgpgme.so symlink was moved to avoid conflict +Conflicts: kdepimlibs-devel < 4.14.10-17 +Requires: q%{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires: %{name}pp-devel%{?_isa} +# For automatic provides +BuildRequires: cmake + +%description -n q%{name}-devel +%{summary}. + +%if %{with python2} +%package -n python2-gpg +Summary: %{name} bindings for Python 2 +%{?python_provide:%python_provide python2-gpg} +BuildRequires: python2-devel +Requires: %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} + +%description -n python2-gpg +%{summary}. +%endif # without python2 + +%package -n python3-gpg +Summary: %{name} bindings for Python 3 +%{?python_provide:%python_provide python3-gpg} +BuildRequires: python3-devel +Requires: %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} + +%description -n python3-gpg +%{summary}. + +%prep +%autosetup -p1 + +## HACK ALERT +# The config script already suppresses the -L if it's /usr/lib, so cheat and +# set it to a value which we know will be suppressed. +sed -i -e 's|^libdir=@libdir@$|libdir=@exec_prefix@/lib|g' src/gpgme-config.in + +find -type f -name Makefile\* -exec sed -i -e 's|GPG = gpg|GPG = gpg2|' {} ';' + +%build +./autogen.sh +%configure --disable-static --disable-silent-rules \ + --enable-languages=cpp,qt,python3 + +%make_build + +%install +%make_install + +# unpackaged files +rm -fv %{buildroot}%{_infodir}/dir +rm -fv %{buildroot}%{_libdir}/lib*.la + +# Hack to resolve multiarch conflict (#341351) +%ifarch %{multilib_arches} +mv %{buildroot}%{_bindir}/gpgme-config{,.%{_target_cpu}} +cat > gpgme-config-multilib.sh <<__END__ +#!/bin/sh +exec %{_bindir}/gpgme-config.\$(arch) \$@ +__END__ +install -D -p gpgme-config-multilib.sh %{buildroot}%{_bindir}/gpgme-config +mv %{buildroot}%{_includedir}/gpgme.h \ + %{buildroot}%{_includedir}/gpgme-%{__isa_bits}.h +install -m644 -p -D %{SOURCE2} %{buildroot}%{_includedir}/gpgme.h +%endif +chrpath -d %{buildroot}%{_bindir}/%{name}-tool +chrpath -d %{buildroot}%{_libdir}/lib%{name}pp.so* +chrpath -d %{buildroot}%{_libdir}/libq%{name}.so* + +# autofoo installs useless stuff for uninstall +%if %{with python2} +rm -vf %{buildroot}%{python2_sitelib}/gpg/install_files.txt +%endif # with python2 +rm -vf %{buildroot}%{python3_sitelib}/gpg/install_files.txt + +%if %{with check} +%check +make check +%endif + +%ldconfig_scriptlets + +%files +%license COPYING* +%doc AUTHORS ChangeLog NEWS README* THANKS TODO VERSION +%{_libdir}/lib%{name}.so.11* + +%post devel +/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || : + +%preun devel +if [ $1 -eq 0 ] ; then + /sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir 2>/dev/null || : +fi + +%files devel +%{_bindir}/%{name}-config +%{_bindir}/%{name}-tool +%ifarch %{multilib_arches} +%{_bindir}/%{name}-config.%{_target_cpu} +%{_includedir}/%{name}-%{__isa_bits}.h +%endif +%{_includedir}/%{name}.h +%{_libdir}/lib%{name}.so +%{_datadir}/aclocal/%{name}.m4 +%{_infodir}/%{name}.info* + +%files -n %{name}pp +%doc lang/cpp/README +%{_libdir}/lib%{name}pp.so.* + +%files -n %{name}pp-devel +%{_includedir}/%{name}++/ +%{_libdir}/lib%{name}pp.so +%{_libdir}/cmake/Gpgmepp/ + +%files -n q%{name} +%doc lang/qt/README +%{_libdir}/libq%{name}.so.* + +%files -n q%{name}-devel +%{_includedir}/q%{name}/ +%{_includedir}/QGpgME/ +%{_libdir}/libq%{name}.so +%{_libdir}/cmake/QGpgme/ + +%if %{with python2} +%files -n python2-gpg +%doc lang/python/README +%{python2_sitearch}/gpg-*.egg-info +%{python2_sitearch}/gpg/ +%endif # with python2 + +%files -n python3-gpg +%doc lang/python/README +%{python3_sitearch}/gpg-*.egg-info +%{python3_sitearch}/gpg/ + +%changelog +* Mon Nov 12 2018 Jiri Kucera - 1.10.0-6 +- Fix important static scanner issues + Resolves: #1602526 + +* Mon May 28 2018 Charalampos Stratakis - 1.10.0-5 +- Conditionalize the python2 subpackage +- Build only the python3 bindings + +* Tue Apr 17 2018 Jonathan Lebon - 1.10.0-4 +- Backport patch to tweak STATUS_FAILURE handling + +* Wed Feb 07 2018 Fedora Release Engineering - 1.10.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 30 2018 Igor Gnatenko - 1.10.0-2 +- Switch to %%ldconfig_scriptlets + +* Wed Dec 13 2017 Igor Gnatenko - 1.10.0-1 +- Update to 1.10.0 + +* Tue Nov 07 2017 Igor Gnatenko - 1.9.0-8 +- Use better Obsoletes for platform-python + +* Fri Nov 03 2017 Igor Gnatenko - 1.9.0-7 +- Remove platform-python subpackages + +* Thu Aug 10 2017 Petr Viktorin - 1.9.0-6 +- Add subpackage for platform-python (https://fedoraproject.org/wiki/Changes/Platform_Python_Stack) + +* Mon Aug 07 2017 Igor Gnatenko - 1.9.0-5 +- Remove BuildRequires: pth-devel, it is not needed for long time + +* Mon Aug 07 2017 Björn Esser - 1.9.0-4 +- Rebuilt for AutoReq cmake-filesystem + +* Wed Aug 02 2017 Fedora Release Engineering - 1.9.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.9.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Wed Mar 29 2017 Igor Gnatenko - 1.9.0-1 +- Update to 1.9.0 + +* Sat Feb 11 2017 Igor Gnatenko - 1.8.0-12 +- Fix FTBFS + +* Fri Feb 10 2017 Fedora Release Engineering - 1.8.0-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Jan 18 2017 Rex Dieter - 1.8.0-10 +- patch out LIBASSUAN_LIBRARIES in cmake too + +* Wed Jan 18 2017 Rex Dieter - 1.8.0-9 +- gpgmepp-devel: Requires: libassuan-devel + +* Mon Jan 16 2017 Rex Dieter - 1.8.0-8 +- qgpgme-devel: Conflicts: kdepimlibs-devel < 4.14.10-17 + +* Sun Jan 01 2017 Rex Dieter - 1.8.0-7 +- rename gpgme-pp to gpgmepp, simplify -devel deps + +* Sun Jan 01 2017 Rex Dieter - 1.8.0-6 +- backport upstream cmake-related fix + +* Thu Dec 22 2016 Miro Hrončok - 1.8.0-5 +- Rebuild for Python 3.6 + +* Sun Dec 11 2016 Igor Gnatenko - 1.8.0-4 +- Rename pythonX-gpgme into pythonX-gpg + +* Sun Dec 11 2016 Igor Gnatenko - 1.8.0-3 +- Add Qt and C++ subpackages + +* Sat Dec 10 2016 Igor Gnatenko - 1.8.0-2 +- Enable tests + +* Sat Dec 10 2016 Igor Gnatenko - 1.8.0-1 +- Update to 1.8.0 + +* Wed Sep 21 2016 Igor Gnatenko - 1.7.0-1 +- Update to 1.7.0 + +* Mon Jul 25 2016 Igor Gnatenko - 1.6.0-3 +- Set min ver for libgpg-error + +* Mon Jul 25 2016 Igor Gnatenko - 1.6.0-2 +- Backport patch for STATUS_KEY_CONSIDERED (RHBZ #1359521) + +* Wed Jul 13 2016 Igor Gnatenko - 1.6.0-1 +- Update to 1.6.0 (RHBZ #1167656) + +* Wed Feb 03 2016 Fedora Release Engineering - 1.4.3-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jun 17 2015 Fedora Release Engineering - 1.4.3-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Sat Dec 06 2014 Frantisek Kluknavsky - 1.4.3-5 +- CVE-2014-3564, rhbz#1125170, gpgme-1.3.2-bufferoverflow.patch + +* Sat Aug 16 2014 Fedora Release Engineering - 1.4.3-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jul 12 2014 Tom Callaway - 1.4.3-3 +- fix license handling + +* Sat Jun 07 2014 Fedora Release Engineering - 1.4.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Wed Oct 09 2013 Rex Dieter - 1.4.3-1 +- gpgme-1.4.3 +- cleanup .spec, trim changelog + +* Sat Aug 03 2013 Fedora Release Engineering - 1.3.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Tue Jul 09 2013 Karsten Hopp 1.3.2-3 +- rebuild to fix some f20 dependency issues on PPC + +* Thu Feb 14 2013 Fedora Release Engineering - 1.3.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Tue Nov 20 2012 Frantisek Kluknavsky - 1.3.2-2 +- minor spec cleanup + +* Wed Sep 26 2012 Tomas Mraz - 1.3.2-1 +- new upstream version +- re-enable gpg tests (original patch by John Morris ) +- quiet configure warning 'could not find g13' +- there is no libgpgme-pth anymore + +* Thu Jul 19 2012 Fedora Release Engineering - 1.3.0-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Sun Apr 22 2012 Rex Dieter 1.3.0-8 +- -devel: make Requires: libgpg-error-devel arch'd +- ensure gpgme-config wrapper is executable + +* Sun Apr 22 2012 Rex Dieter 1.3.0-7 +- gpgme.h: fatal error: gpgme-i386.h: No such file or directory compilation terminated (#815116) + +* Wed Feb 15 2012 Simon Lukasik - 1.3.0-6 +- Resolve multilib conflict of gpgme-config (#341351) +- Resolve multilib conflict of gpgme.h (#341351) + +* Fri Jan 13 2012 Fedora Release Engineering - 1.3.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Mar 17 2011 Rex Dieter - 1.3.0-4 +- gpgme-config: remove libassuan-related flags as threatened (#676954) +\ +* Sun Feb 13 2011 Rex Dieter - 1.3.0-3 +- -devel: fix typo (broken dep) + +* Sat Feb 12 2011 Rex Dieter - 1.3.0-2 +- BR: libassuan2-devel +- gpgme-config outputs -lassuan (#676954) + +* Fri Feb 11 2011 Tomas Mraz - 1.3.0-1 +- new upstream version + +* Tue Feb 08 2011 Fedora Release Engineering - 1.2.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Wed Aug 18 2010 Tomas Mraz - 1.2.0-3 +- fix the condition for adding the -D_FILE_OFFSET_BITS... + +* Wed Aug 11 2010 Tomas Mraz - 1.2.0-2 +- add -D_FILE_OFFSET_BITS... to gpgme-config as appropriate (#621698) + +* Fri Jul 02 2010 Rex Dieter - 1.2.0-1 +- gpgme-1.2.0 (#610984) + +* Sun Feb 14 2010 Rex Dieter - 1.1.8-4 +- FTBFS gpgme-1.1.8-3.fc13: ImplicitDSOLinking (#564605) + +* Thu Nov 19 2009 Tomas Mraz - 1.1.8-3 +- Add buildrequires gnupg2-smime for the gpgsm + +* Fri Jul 24 2009 Fedora Release Engineering - 1.1.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Sat Jun 20 2009 Rex Dieter - 1.1.8-1 +- gpgme-1.1.8 +- -devel: s/postun/preun/ info scriptlet + +* Wed Mar 11 2009 Rex Dieter - 1.1.7-3 +- track shlib sonames closer, to highlight future abi/soname changes +- _with_gpg macro, to potentially conditionalize gnupg vs gnupg2 defaults + for various os/releases (ie, fedora vs rhel) + +* Tue Feb 24 2009 Fedora Release Engineering - 1.1.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Sat Oct 18 2008 Rex Dieter 1.1.7-1 +- gpgme-1.1.7 + +* Sun Feb 17 2008 Rex Dieter 1.1.6-3 +- --with-gpg=%%_bindir/gpg2 (#432445) +- drop Requires: gnupg (#432445) + +* Fri Feb 08 2008 Rex Dieter 1.1.6-2 +- respin (gcc43) + +* Fri Jan 04 2008 Rex Dieter 1.1.6-1 +- gpgme-1.1.6 +- multiarch conflicts in gpgme (#341351) + +* Sat Aug 25 2007 Rex Dieter 1.1.5-4 +- BR: gawk + +* Sat Aug 25 2007 Rex Dieter 1.1.5-3 +- respin (BuildID) + +* Thu Aug 09 2007 Rex Dieter 1.1.5-2 +- License: LGPLv2+ + +* Mon Jul 09 2007 Rex Dieter 1.1.5-1 +- gpgme-1.1.5 + +* Mon Mar 05 2007 Rex Dieter 1.1.4-1 +- gpgme-1.1.4 + +* Sat Feb 03 2007 Rex Dieter 1.1.3-1 +- gpgme-1.1.3 + +* Tue Oct 03 2006 Rex Dieter +- respin + +* Mon Sep 18 2006 Rex Dieter 1.1.2-6 +- fix gpgme-config --thread=pthread --cflags + +* Tue Aug 29 2006 Rex Dieter 1.1.2-5 +- fc6 respin + +* Mon Mar 6 2006 Rex Dieter 1.1.2-4 +- add back support for gpgme-config --thread=pthread + +* Mon Mar 6 2006 Rex Dieter 1.1.2-2 +- drop extraneous libs from gpgme-config + +* Fri Mar 3 2006 Rex Dieter 1.1.2-1 +- 1.1.2 +- drop upstreamed gpgme-1.1.0-tests.patch + +* Wed Mar 1 2006 Rex Dieter +- fc5: gcc/glibc respin + +* Wed Nov 30 2005 Rex Dieter - 1.1.0-3 +- (re)build against (newer) libksba/gnupg2 + +* Thu Oct 06 2005 Rex Dieter - 1.1.0-2 +- 1.1.0 + +* Mon Aug 8 2005 Rex Dieter - 1.0.3-1 +- 1.0.3 +- --disable-static + +* Thu May 12 2005 Michael Schwendt - 1.0.2-3 +- rebuilt + +* Fri Mar 18 2005 Ville Skyttä - 1.0.2-2 +- Fix FC4 build. + +* Tue Feb 1 2005 Michael Schwendt - 0:1.0.2-1 +- LGPL used here, and made summary more explicit. +- Remove dirmngr dependency (gpgsm interfaces with it). +- Obsolete cryptplug as gpgme >= 0.4.5 provides what we used cryptplug for. + +* Thu Jan 06 2005 Rex Dieter 0:1.0.2-0.fdr.1 +- 1.0.2 + +* Thu Oct 21 2004 Rex Dieter 0:1.0.0-0.fdr.1 +- 1.0.0 +- Requires: dirmngr + +* Tue Oct 19 2004 Rex Dieter 0:0.4.7-0.fdr.1 +- 0.4.7 + +* Sun May 2 2004 Ville Skyttä - 0:0.4.3-0.fdr.3 +- Require %%{_bindir}/gpgsm instead of newpg. +- Cosmetic spec file improvements. + +* Thu Oct 23 2003 Ville Skyttä - 0:0.4.3-0.fdr.2 +- Update description. + +* Tue Oct 7 2003 Ville Skyttä - 0:0.4.3-0.fdr.1 +- Update to 0.4.3. + +* Fri Aug 15 2003 Ville Skyttä - 0:0.4.2-0.fdr.1 +- Update to 0.4.2. +- make check in the %%check section. + +* Thu Jul 10 2003 Ville Skyttä - 0:0.4.1-0.fdr.1 +- Update to 0.4.1. +- Make -devel cooperate with --excludedocs. + +* Sat Apr 19 2003 Ville Skyttä - 0:0.4.0-0.fdr.2 +- BuildRequire pth-devel, fix missing epoch in -devel Requires (#169). +- Save .spec in UTF-8. + +* Sat Mar 22 2003 Ville Skyttä - 0:0.4.0-0.fdr.1 +- Update to current Fedora guidelines. +- Exclude %%{_libdir}/*.la. + +* Tue Feb 12 2003 Warren Togami 0.4.0-1.fedora.3 +- info/dir temporary workaround + +* Sat Feb 8 2003 Ville Skyttä - 0.4.0-1.fedora.1 +- First Fedora release.