From 339ebfd450cab114f84abfecce9a8d4ac2272406 Mon Sep 17 00:00:00 2001 From: oreo639 Date: Mon, 17 Oct 2022 21:20:40 -0700 Subject: [PATCH] gpgme: fix returning incorrect error codes Fix integer overflow on 32-bit tests. This also catches an issue with gpgme returning the wrong error codes. --- .../gpgme/patches/0001-tests-log-error.patch | 51 ++++++ .../0002-tests-expiration-time-unsigned.patch | 159 ++++++++++++++++++ .../gpgme/patches/0003-tests-fix-32bit.patch | 75 +++++++++ .../gpgme/patches/fix-error-conditions.patch | 40 +++++ srcpkgs/gpgme/template | 2 +- 5 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/gpgme/patches/0001-tests-log-error.patch create mode 100644 srcpkgs/gpgme/patches/0002-tests-expiration-time-unsigned.patch create mode 100644 srcpkgs/gpgme/patches/0003-tests-fix-32bit.patch create mode 100644 srcpkgs/gpgme/patches/fix-error-conditions.patch diff --git a/srcpkgs/gpgme/patches/0001-tests-log-error.patch b/srcpkgs/gpgme/patches/0001-tests-log-error.patch new file mode 100644 index 000000000000..50443efe2e7e --- /dev/null +++ b/srcpkgs/gpgme/patches/0001-tests-log-error.patch @@ -0,0 +1,51 @@ +From 81d4b7f2d7077297d76af5728949d8f2bdff8cd5 Mon Sep 17 00:00:00 2001 +From: =?utf8?q?Ingo=20Kl=C3=B6cker?= +Date: Wed, 17 Aug 2022 14:56:13 +0200 +Subject: [PATCH] qt,tests: Log the actual error code if the assertion fails + +* lang/qt/tests/t-addexistingsubkey.cpp ( +AddExistingSubkeyJobTest::testAddExistingSubkeyAsync, +AddExistingSubkeyJobTest::testAddExistingSubkeySync, +AddExistingSubkeyJobTest::testAddExistingSubkeyWithExpiration): Use +QCOMPARE instead of QVERIFY for asserting equality. +-- + +GnuPG-bug-id: 6137 +--- + lang/qt/tests/t-addexistingsubkey.cpp | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/lang/qt/tests/t-addexistingsubkey.cpp b/lang/qt/tests/t-addexistingsubkey.cpp +index 589c90bf..2e654cec 100644 +--- a/lang/qt/tests/t-addexistingsubkey.cpp ++++ b/lang/qt/tests/t-addexistingsubkey.cpp +@@ -168,7 +168,7 @@ private Q_SLOTS: + QSignalSpy spy (this, SIGNAL(asyncDone())); + QVERIFY(spy.wait(QSIGNALSPY_TIMEOUT)); + +- QVERIFY(result.code() == GPG_ERR_NO_ERROR); ++ QCOMPARE(result.code(), static_cast(GPG_ERR_NO_ERROR)); + key.update(); + QCOMPARE(key.numSubkeys(), 3u); + } +@@ -190,7 +190,7 @@ private Q_SLOTS: + + const auto result = job->exec(key, sourceSubkey); + +- QVERIFY(result.code() == GPG_ERR_NO_ERROR); ++ QCOMPARE(result.code(), static_cast(GPG_ERR_NO_ERROR)); + key.update(); + QCOMPARE(key.numSubkeys(), 3u); + QCOMPARE(key.subkey(2).expirationTime(), 0); +@@ -213,7 +213,7 @@ private Q_SLOTS: + + const auto result = job->exec(key, sourceSubkey); + +- QVERIFY(result.code() == GPG_ERR_NO_ERROR); ++ QCOMPARE(result.code(), static_cast(GPG_ERR_NO_ERROR)); + key.update(); + QCOMPARE(key.numSubkeys(), 3u); + +-- +2.11.0 + diff --git a/srcpkgs/gpgme/patches/0002-tests-expiration-time-unsigned.patch b/srcpkgs/gpgme/patches/0002-tests-expiration-time-unsigned.patch new file mode 100644 index 000000000000..57aef8852a12 --- /dev/null +++ b/srcpkgs/gpgme/patches/0002-tests-expiration-time-unsigned.patch @@ -0,0 +1,159 @@ +From f2b48de26b8f8c48c293423eda712831544924f6 Mon Sep 17 00:00:00 2001 +From: =?utf8?q?Ingo=20Kl=C3=B6cker?= +Date: Wed, 17 Aug 2022 15:22:29 +0200 +Subject: [PATCH] qt,tests: Make sure expiration time is interpreted as + unsigned number + +* lang/qt/tests/t-addexistingsubkey.cpp, +lang/qt/tests/t-changeexpiryjob.cpp: Convert expiration time to +uint_least32_t. +-- + +This doesn't change the outcome of the tests (they also pass without +this change because of the expiration dates of the test keys), but it's +still good practise to treat the expiration time as an unsigned number +if the assertions check that the expiration time is in some range. + +GnuPG-bug-id: 6137 +--- + lang/qt/tests/t-addexistingsubkey.cpp | 6 +++--- + lang/qt/tests/t-changeexpiryjob.cpp | 26 +++++++++++++------------- + 2 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/lang/qt/tests/t-addexistingsubkey.cpp b/lang/qt/tests/t-addexistingsubkey.cpp +index 2e654cec..87eadf43 100644 +--- a/lang/qt/tests/t-addexistingsubkey.cpp ++++ b/lang/qt/tests/t-addexistingsubkey.cpp +@@ -222,9 +222,9 @@ private Q_SLOTS: + // several times + const auto allowedDeltaTSeconds = 1; + const auto expectedExpirationRange = std::make_pair( +- sourceSubkey.expirationTime() - allowedDeltaTSeconds, +- sourceSubkey.expirationTime() + allowedDeltaTSeconds); +- const auto actualExpiration = key.subkey(2).expirationTime(); ++ uint_least32_t(sourceSubkey.expirationTime()) - allowedDeltaTSeconds, ++ uint_least32_t(sourceSubkey.expirationTime()) + allowedDeltaTSeconds); ++ const auto actualExpiration = uint_least32_t(key.subkey(2).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +diff --git a/lang/qt/tests/t-changeexpiryjob.cpp b/lang/qt/tests/t-changeexpiryjob.cpp +index 090002f3..3da74d46 100644 +--- a/lang/qt/tests/t-changeexpiryjob.cpp ++++ b/lang/qt/tests/t-changeexpiryjob.cpp +@@ -70,7 +70,7 @@ private Q_SLOTS: + QVERIFY(!key.isNull()); + QVERIFY(!key.subkey(0).isNull()); + QVERIFY(!key.subkey(1).isNull()); +- const auto subkeyExpiration = key.subkey(1).expirationTime(); ++ const auto subkeyExpiration = uint_least32_t(key.subkey(1).expirationTime()); + + { + // Create the job +@@ -101,7 +101,7 @@ private Q_SLOTS: + newExpirationDate.toSecsSinceEpoch() - 10, + QDateTime::currentDateTime().addDays(1).toSecsSinceEpoch()); + { +- const auto actualExpiration = key.subkey(0).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(0).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +@@ -110,7 +110,7 @@ private Q_SLOTS: + "; expected: " + std::to_string(expectedExpirationRange.second)).c_str()); + } + { +- const auto actualExpiration = key.subkey(1).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(1).expirationTime()); + QCOMPARE(actualExpiration, subkeyExpiration); // unchanged + } + } +@@ -133,7 +133,7 @@ private Q_SLOTS: + QVERIFY(!key.isNull()); + QVERIFY(!key.subkey(0).isNull()); + QVERIFY(!key.subkey(1).isNull()); +- const auto primaryKeyExpiration = key.subkey(0).expirationTime(); ++ const auto primaryKeyExpiration = uint_least32_t(key.subkey(0).expirationTime()); + + { + // Create the job +@@ -164,11 +164,11 @@ private Q_SLOTS: + newExpirationDate.toSecsSinceEpoch() - 10, + QDateTime::currentDateTime().addDays(2).toSecsSinceEpoch()); + { +- const auto actualExpiration = key.subkey(0).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(0).expirationTime()); + QCOMPARE(actualExpiration, primaryKeyExpiration); // unchanged + } + { +- const auto actualExpiration = key.subkey(1).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(1).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +@@ -196,7 +196,7 @@ private Q_SLOTS: + QVERIFY(!key.isNull()); + QVERIFY(!key.subkey(0).isNull()); + QVERIFY(!key.subkey(1).isNull()); +- const auto subkeyExpiration = key.subkey(1).expirationTime(); ++ const auto subkeyExpiration = uint_least32_t(key.subkey(1).expirationTime()); + + { + // Create the job +@@ -228,7 +228,7 @@ private Q_SLOTS: + newExpirationDate.toSecsSinceEpoch() - 10, + QDateTime::currentDateTime().addDays(3).toSecsSinceEpoch()); + { +- const auto actualExpiration = key.subkey(0).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(0).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +@@ -237,7 +237,7 @@ private Q_SLOTS: + "; expected: " + std::to_string(expectedExpirationRange.second)).c_str()); + } + { +- const auto actualExpiration = key.subkey(1).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(1).expirationTime()); + QCOMPARE(actualExpiration, subkeyExpiration); // unchanged + } + } +@@ -291,7 +291,7 @@ private Q_SLOTS: + newExpirationDate.toSecsSinceEpoch() - 10, + QDateTime::currentDateTime().addDays(4).toSecsSinceEpoch()); + { +- const auto actualExpiration = key.subkey(0).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(0).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +@@ -300,7 +300,7 @@ private Q_SLOTS: + "; expected: " + std::to_string(expectedExpirationRange.second)).c_str()); + } + { +- const auto actualExpiration = key.subkey(1).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(1).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +@@ -359,7 +359,7 @@ private Q_SLOTS: + newExpirationDate.toSecsSinceEpoch() - 10, + QDateTime::currentDateTime().addDays(5).toSecsSinceEpoch()); + { +- const auto actualExpiration = key.subkey(0).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(0).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +@@ -368,7 +368,7 @@ private Q_SLOTS: + "; expected: " + std::to_string(expectedExpirationRange.second)).c_str()); + } + { +- const auto actualExpiration = key.subkey(1).expirationTime(); ++ const auto actualExpiration = uint_least32_t(key.subkey(1).expirationTime()); + QVERIFY2(actualExpiration >= expectedExpirationRange.first, + ("actual: " + std::to_string(actualExpiration) + + "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +-- +2.11.0 + diff --git a/srcpkgs/gpgme/patches/0003-tests-fix-32bit.patch b/srcpkgs/gpgme/patches/0003-tests-fix-32bit.patch new file mode 100644 index 000000000000..aaaf57582f00 --- /dev/null +++ b/srcpkgs/gpgme/patches/0003-tests-fix-32bit.patch @@ -0,0 +1,75 @@ +From 2e7a61b898fccc1c20000b79dee83cd980901fa9 Mon Sep 17 00:00:00 2001 +From: =?utf8?q?Ingo=20Kl=C3=B6cker?= +Date: Thu, 18 Aug 2022 10:55:09 +0200 +Subject: [PATCH] qt,tests: Make test pass on 32-bit systems + +* lang/qt/tests/t-addexistingsubkey.cpp +(AddExistingSubkeyJobTest::testAddExistingSubkeyWithExpiration): Handle +negative expiration date. +-- + +On 32-bit systems the expiration date of the test key overflows. This +will cause the AddExistingSubkeyJob to fail. We expect it to fail with +an "invalid time" error. + +GnuPG-bug-id: 6137 +--- + lang/qt/tests/t-addexistingsubkey.cpp | 42 ++++++++++++++++++++--------------- + 1 file changed, 24 insertions(+), 18 deletions(-) + +diff --git a/lang/qt/tests/t-addexistingsubkey.cpp b/lang/qt/tests/t-addexistingsubkey.cpp +index 87eadf43..c0eee57b 100644 +--- a/lang/qt/tests/t-addexistingsubkey.cpp ++++ b/lang/qt/tests/t-addexistingsubkey.cpp +@@ -213,24 +213,30 @@ private Q_SLOTS: + + const auto result = job->exec(key, sourceSubkey); + +- QCOMPARE(result.code(), static_cast(GPG_ERR_NO_ERROR)); +- key.update(); +- QCOMPARE(key.numSubkeys(), 3u); +- +- // allow 1 second different expiration because gpg calculates with +- // expiration as difference to current time and takes current time +- // several times +- const auto allowedDeltaTSeconds = 1; +- const auto expectedExpirationRange = std::make_pair( +- uint_least32_t(sourceSubkey.expirationTime()) - allowedDeltaTSeconds, +- uint_least32_t(sourceSubkey.expirationTime()) + allowedDeltaTSeconds); +- const auto actualExpiration = uint_least32_t(key.subkey(2).expirationTime()); +- QVERIFY2(actualExpiration >= expectedExpirationRange.first, +- ("actual: " + std::to_string(actualExpiration) + +- "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); +- QVERIFY2(actualExpiration <= expectedExpirationRange.second, +- ("actual: " + std::to_string(actualExpiration) + +- "; expected: " + std::to_string(expectedExpirationRange.second)).c_str()); ++ if (sourceSubkey.expirationTime() > 0) { ++ QCOMPARE(result.code(), static_cast(GPG_ERR_NO_ERROR)); ++ key.update(); ++ QCOMPARE(key.numSubkeys(), 3u); ++ ++ // allow 1 second different expiration because gpg calculates with ++ // expiration as difference to current time and takes current time ++ // several times ++ const auto allowedDeltaTSeconds = 1; ++ const auto expectedExpirationRange = std::make_pair( ++ uint_least32_t(sourceSubkey.expirationTime()) - allowedDeltaTSeconds, ++ uint_least32_t(sourceSubkey.expirationTime()) + allowedDeltaTSeconds); ++ const auto actualExpiration = uint_least32_t(key.subkey(2).expirationTime()); ++ QVERIFY2(actualExpiration >= expectedExpirationRange.first, ++ ("actual: " + std::to_string(actualExpiration) + ++ "; expected: " + std::to_string(expectedExpirationRange.first)).c_str()); ++ QVERIFY2(actualExpiration <= expectedExpirationRange.second, ++ ("actual: " + std::to_string(actualExpiration) + ++ "; expected: " + std::to_string(expectedExpirationRange.second)).c_str()); ++ } else { ++ // on 32-bit systems the expiration date of the test key overflows; ++ // in this case we expect an appropriate error code ++ QCOMPARE(result.code(), static_cast(GPG_ERR_INV_TIME)); ++ } + } + + private: +-- +2.11.0 + diff --git a/srcpkgs/gpgme/patches/fix-error-conditions.patch b/srcpkgs/gpgme/patches/fix-error-conditions.patch new file mode 100644 index 000000000000..f70e167784ce --- /dev/null +++ b/srcpkgs/gpgme/patches/fix-error-conditions.patch @@ -0,0 +1,40 @@ +From 2fa5c80aeba4528b3bdf41ec5740e7db5d4b6d2b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= +Date: Thu, 18 Aug 2022 10:43:19 +0200 +Subject: [PATCH] cpp: Fix handling of "no key" or "invalid time" situations + +* lang/cpp/src/gpgaddexistingsubkeyeditinteractor.cpp +(GpgAddExistingSubkeyEditInteractor::Private::nextState): Fix inverted +logic of string comparisons. +-- + +This fixes the problem that the interactor didn't return the proper +error code if gpg didn't accept the key grip or the expiration date. + +GnuPG-bug-id: 6137 +--- + lang/cpp/src/gpgaddexistingsubkeyeditinteractor.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lang/cpp/src/gpgaddexistingsubkeyeditinteractor.cpp b/lang/cpp/src/gpgaddexistingsubkeyeditinteractor.cpp +index 547e613d..8eec7460 100644 +--- a/lang/cpp/src/gpgaddexistingsubkeyeditinteractor.cpp ++++ b/lang/cpp/src/gpgaddexistingsubkeyeditinteractor.cpp +@@ -136,7 +136,7 @@ unsigned int GpgAddExistingSubkeyEditInteractor::Private::nextState(unsigned int + strcmp(args, "keygen.flags") == 0) { + return FLAGS; + } else if (status == GPGME_STATUS_GET_LINE && +- strcmp(args, "keygen.keygrip")) { ++ strcmp(args, "keygen.keygrip") == 0) { + err = NO_KEY_ERROR; + return ERROR; + } +@@ -157,7 +157,7 @@ unsigned int GpgAddExistingSubkeyEditInteractor::Private::nextState(unsigned int + strcmp(args, "keyedit.prompt") == 0) { + return QUIT; + } else if (status == GPGME_STATUS_GET_LINE && +- strcmp(args, "keygen.valid")) { ++ strcmp(args, "keygen.valid") == 0) { + err = INV_TIME_ERROR; + return ERROR; + } diff --git a/srcpkgs/gpgme/template b/srcpkgs/gpgme/template index b1cfd5f78657..249d7b472eb9 100644 --- a/srcpkgs/gpgme/template +++ b/srcpkgs/gpgme/template @@ -1,7 +1,7 @@ # Template file for 'gpgme' pkgname=gpgme version=1.18.0 -revision=1 +revision=2 build_style=gnu-configure configure_args="--enable-fd-passing --with-libgpg-error-prefix=$XBPS_CROSS_BASE/usr