diff --git a/main/apk-tools/0001-add-fix-virtual-package-id-generation.patch b/main/apk-tools/0001-add-fix-virtual-package-id-generation.patch new file mode 100644 index 0000000000000000000000000000000000000000..fdc780dcd219031f803519ba5f96a7b9a5e8c589 --- /dev/null +++ b/main/apk-tools/0001-add-fix-virtual-package-id-generation.patch @@ -0,0 +1,109 @@ +From b45415b1096e76f40b32326d2798123f81fe5976 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Tue, 2 Jul 2019 15:27:57 +0300 +Subject: [PATCH] add: fix virtual package id generation + +Fixes 37fbafcd by adding more input to the hash than just second +grained time stamp - collisions would happen when running apk +scripted. + +For virtual package the hash works only as unique identifier, so +try to add elements that should make it unique in most cases. + +Fixes #10648 +--- + src/add.c | 51 +++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 35 insertions(+), 16 deletions(-) + +diff --git a/src/add.c b/src/add.c +index 2d342ab..e028736 100644 +--- a/src/add.c ++++ b/src/add.c +@@ -11,6 +11,7 @@ + + #include + #include ++#include + #include "apk_applet.h" + #include "apk_database.h" + #include "apk_print.h" +@@ -80,6 +81,38 @@ static int non_repository_check(struct apk_database *db) + return 1; + } + ++static struct apk_package *create_virtual_package(struct apk_database *db, struct apk_name *name) ++{ ++ char ver[32]; ++ struct apk_package *virtpkg; ++ struct tm tm; ++ EVP_MD_CTX *mdctx; ++ time_t now = apk_time(); ++ pid_t pid = getpid(); ++ ++ localtime_r(&now, &tm); ++ strftime(ver, sizeof ver, "%Y%m%d.%H%M%S", &tm); ++ ++ virtpkg = apk_pkg_new(); ++ if (virtpkg == NULL) return 0; ++ ++ virtpkg->name = name; ++ virtpkg->version = apk_blob_atomize(APK_BLOB_STR(ver)); ++ virtpkg->description = strdup("virtual meta package"); ++ virtpkg->arch = apk_blob_atomize(APK_BLOB_STR("noarch")); ++ ++ mdctx = EVP_MD_CTX_new(); ++ EVP_DigestInit_ex(mdctx, apk_checksum_default(), NULL); ++ EVP_DigestUpdate(mdctx, &tm, sizeof tm); ++ EVP_DigestUpdate(mdctx, &pid, sizeof pid); ++ EVP_DigestUpdate(mdctx, virtpkg->name->name, strlen(virtpkg->name->name) + 1); ++ virtpkg->csum.type = EVP_MD_CTX_size(mdctx); ++ EVP_DigestFinal_ex(mdctx, virtpkg->csum.data, NULL); ++ EVP_MD_CTX_free(mdctx); ++ ++ return virtpkg; ++} ++ + static int add_main(void *ctx, struct apk_database *db, struct apk_string_array *args) + { + struct add_ctx *actx = (struct add_ctx *) ctx; +@@ -93,10 +126,6 @@ static int add_main(void *ctx, struct apk_database *db, struct apk_string_array + + if (actx->virtpkg) { + apk_blob_t b = APK_BLOB_STR(actx->virtpkg); +- struct tm tm; +- time_t now; +- char ver[32]; +- + apk_blob_pull_dep(&b, db, &virtdep); + if (APK_BLOB_IS_NULL(b) || virtdep.conflict || + virtdep.result_mask != APK_DEPMASK_ANY || +@@ -104,24 +133,14 @@ static int add_main(void *ctx, struct apk_database *db, struct apk_string_array + apk_error("%s: bad package specifier"); + return -1; + } +- + if (virtdep.name->name[0] != '.' && non_repository_check(db)) + return -1; + +- now = apk_time(); +- localtime_r(&now, &tm); +- strftime(ver, sizeof ver, "%Y%m%d.%H%M%S", &tm); +- +- virtpkg = apk_pkg_new(); +- if (virtpkg == NULL) { ++ virtpkg = create_virtual_package(db, virtdep.name); ++ if (!virtpkg) { + apk_error("Failed to allocate virtual meta package"); + return -1; + } +- virtpkg->name = virtdep.name; +- apk_blob_checksum(APK_BLOB_STR(ver), apk_checksum_default(), &virtpkg->csum); +- virtpkg->version = apk_blob_atomize(APK_BLOB_STR(ver)); +- virtpkg->description = strdup("virtual meta package"); +- virtpkg->arch = apk_blob_atomize(APK_BLOB_STR("noarch")); + + virtdep.result_mask = APK_VERSION_EQUAL; + virtdep.version = virtpkg->version; +-- +2.22.0 + diff --git a/main/apk-tools/APKBUILD b/main/apk-tools/APKBUILD index 63df16df640d293992db420aa05e32cf80f13925..3e7d5556d6f5f078b8f011ee95510f2394185e84 100644 --- a/main/apk-tools/APKBUILD +++ b/main/apk-tools/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa pkgname=apk-tools pkgver=2.10.4 -pkgrel=1 +pkgrel=2 pkgdesc="Alpine Package Keeper - package manager for alpine" subpackages="$pkgname-static" depends= @@ -13,6 +13,7 @@ if [ "$CBUILD" = "$CHOST" ]; then makedepends="$makedepends lua5.2-dev" fi source="https://dev.alpinelinux.org/archive/$pkgname/$pkgname-$pkgver.tar.xz + 0001-add-fix-virtual-package-id-generation.patch lua-apk_time.patch " @@ -84,4 +85,5 @@ luaapk() { } sha512sums="d2d9fde0aae9059236f68a3fc2f2186104bb9a099b15d296a6202a20ab2912638f10bb3b9edb70f359d060c5839573c3d50ef37d13095fa01c66dc3219ab6e39 apk-tools-2.10.4.tar.xz +3cf1ae421e136ebe8c037a468fbeb3bca11668eb04dd4b8b9346c4089306002c891d6c2544d22522550f37a4fad0dfcecabceb4c8872165ea6827dcce46d9f2b 0001-add-fix-virtual-package-id-generation.patch 7751f4ddbf3f1b14f5d70ea0f8c2f78168d6138272f883fe1c0137ed135c3f3639f4bf2860dbf6b6de0d4321c93ec9c150edaf5f496c4dc0fedd0a201f399599 lua-apk_time.patch"