diff options
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.patch | 62 |
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 + |