aboutsummaryrefslogtreecommitdiffstats
path: root/main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch')
-rw-r--r--main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch b/main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch
new file mode 100644
index 0000000000..de2d313448
--- /dev/null
+++ b/main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch
@@ -0,0 +1,62 @@
+From a7360395ea963334e80fb49d3fc36789d6f40685 Mon Sep 17 00:00:00 2001
+From: Timo Teras <timo.teras@iki.fi>
+Date: Mon, 26 Oct 2009 09:46:09 +0200
+Subject: [PATCH 2/2] db: fix migration and pruning of symlinks to dirs
+
+the old code treated a symlink to directory as file; it tried
+to calculate regular has of it. fix this by: 1) using no follow
+on migration and pruning stats, and 2) the helper function to
+check if it's point to directory and not calculate hash in that
+case. fixes #188.
+---
+ src/database.c | 6 ++++--
+ src/io.c | 2 +-
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/src/database.c b/src/database.c
+index 16f8bb8..5b1d6bb 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -1810,7 +1810,7 @@ static void apk_db_purge_pkg(struct apk_database *db,
+ if (!(diri->dir->flags & APK_DBDIRF_PROTECTED) ||
+ (apk_flags & APK_PURGE) ||
+ (file->csum.type != APK_CHECKSUM_NONE &&
+- apk_file_get_info(db->root_fd, name, file->csum.type, &fi) == 0 &&
++ apk_file_get_info(db->root_fd, name, APK_FI_NOFOLLOW | file->csum.type, &fi) == 0 &&
+ apk_checksum_compare(&file->csum, &fi.csum) == 0))
+ unlinkat(db->root_fd, name, 0);
+ if (apk_verbosity >= 3)
+@@ -1868,6 +1868,7 @@ static void apk_db_migrate_files(struct apk_database *db,
+ if (ofile != NULL &&
+ (diri->dir->flags & APK_DBDIRF_PROTECTED))
+ cstype = ofile->csum.type;
++ cstype |= APK_FI_NOFOLLOW;
+
+ r = apk_file_get_info(db->root_fd, name, cstype, &fi);
+ if ((diri->dir->flags & APK_DBDIRF_PROTECTED) &&
+@@ -1882,7 +1883,8 @@ static void apk_db_migrate_files(struct apk_database *db,
+ * existing file */
+ if (ofile == NULL ||
+ ofile->csum.type != file->csum.type)
+- apk_file_get_info(db->root_fd, name, file->csum.type, &fi);
++ apk_file_get_info(db->root_fd, name,
++ APK_FI_NOFOLLOW | file->csum.type, &fi);
+ if ((apk_flags & APK_CLEAN_PROTECTED) ||
+ (file->csum.type != APK_CHECKSUM_NONE &&
+ apk_checksum_compare(&file->csum, &fi.csum) == 0))
+diff --git a/src/io.c b/src/io.c
+index 40590a2..3e292a7 100644
+--- a/src/io.c
++++ b/src/io.c
+@@ -487,7 +487,7 @@ int apk_file_get_info(int atfd, const char *filename, unsigned int flags,
+ .device = st.st_dev,
+ };
+
+- if (checksum == APK_CHECKSUM_NONE)
++ if (checksum == APK_CHECKSUM_NONE || S_ISDIR(st.st_mode))
+ return 0;
+
+ if ((flags & APK_FI_NOFOLLOW) && S_ISLNK(st.st_mode)) {
+--
+1.6.5
+