aboutsummaryrefslogtreecommitdiffstats
path: root/main/apk-tools/0002-db-fix-migration-and-pruning-of-symlinks-to-dirs.patch
blob: de2d3134482b496774fb6bea29a09fa4bd8e4443 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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