aboutsummaryrefslogtreecommitdiffstats
path: root/main/apk-tools/0001-db-fix-checksum-storing-to-db.patch
blob: c54fe73b48b8735d7d8894ef079a2e00f005c667 (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
63
64
65
66
67
68
69
70
71
72
73
From c1fe6d08f3ba77bf13b098216fc5e5bcd4ba23f7 Mon Sep 17 00:00:00 2001
From: Timo Teras <timo.teras@iki.fi>
Date: Thu, 30 Jul 2009 11:55:59 +0300
Subject: [PATCH] db: fix checksum storing to db

also take precautions in audit code if the db is missing the
checksum.
---
 src/audit.c    |    7 +++----
 src/database.c |    8 ++++++--
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/audit.c b/src/audit.c
index 31965df..76bd492 100644
--- a/src/audit.c
+++ b/src/audit.c
@@ -69,10 +69,9 @@ static int audit_directory(apk_hash_item item, void *ctx)
 		} else {
 			dbf = apk_db_file_query(db, bdir, APK_BLOB_STR(de->d_name));
 			if (dbf != NULL) {
-				if (apk_file_get_info(tmp, dbf->csum.type, &fi) < 0)
-					continue;
-
-				if (apk_checksum_compare(&fi.csum, &dbf->csum) == 0)
+				if (dbf->csum.type != APK_CHECKSUM_NONE &&
+				    apk_file_get_info(tmp, dbf->csum.type, &fi) == 0 &&
+				    apk_checksum_compare(&fi.csum, &dbf->csum) == 0)
 					continue;
 
 				reason = 'U';
diff --git a/src/database.c b/src/database.c
index 968d55e..16ae94b 100644
--- a/src/database.c
+++ b/src/database.c
@@ -1458,6 +1458,7 @@ static int apk_db_install_archive_entry(void *_ctx,
 			 diri->dir->name, file->name);
 		r = apk_archive_entry_extract(ae, is, alt_name,
 					      extract_cb, ctx);
+		memcpy(&file->csum, &ae->csum, sizeof(file->csum));
 	} else {
 		if (apk_verbosity >= 3)
 			apk_message("%s", ae->name);
@@ -1502,7 +1503,8 @@ static void apk_db_purge_pkg(struct apk_database *db, struct apk_package *pkg,
 			hash = apk_blob_hash_seed(key.filename, diri->dir->hash);
 			if (!(diri->dir->flags & APK_DBDIRF_PROTECTED) ||
 			    (apk_flags & APK_PURGE) ||
-			    (apk_file_get_info(name, file->csum.type, &fi) == 0 &&
+			    (file->csum.type != APK_CHECKSUM_NONE &&
+			     apk_file_get_info(name, file->csum.type, &fi) == 0 &&
 			     apk_checksum_compare(&file->csum, &fi.csum) == 0))
 				unlink(name);
 			if (apk_verbosity >= 3)
@@ -1565,6 +1567,7 @@ static void apk_db_migrate_files(struct apk_database *db,
 			if ((diri->dir->flags & APK_DBDIRF_PROTECTED) &&
 			    (r == 0) &&
 			    (ofile == NULL ||
+			     ofile->csum.type == APK_CHECKSUM_NONE ||
 			     apk_checksum_compare(&ofile->csum, &fi.csum) != 0)) {
 				/* Protected directory, with file without
 				 * db entry, or local modifications.
@@ -1575,7 +1578,8 @@ static void apk_db_migrate_files(struct apk_database *db,
 				    ofile->csum.type != file->csum.type)
 					apk_file_get_info(name, file->csum.type, &fi);
 				if ((apk_flags & APK_CLEAN_PROTECTED) ||
-				    apk_checksum_compare(&file->csum, &fi.csum) == 0)
+				    (file->csum.type != APK_CHECKSUM_NONE &&
+				     apk_checksum_compare(&file->csum, &fi.csum) == 0))
 					unlink(tmpname);
 			} else {
 				/* Overwrite the old file */
-- 
1.6.3.3