diff mbox series

[opkg,4/5] download: purge cached packages that have incorrect checksum

Message ID 20200824230032.492951-5-baptiste@bitsofnetworks.org
State Accepted
Headers show
Series Purge packages from cache when they have incorrect checksum | expand

Commit Message

Baptiste Jonglez Aug. 24, 2020, 11 p.m. UTC
From: Baptiste Jonglez <git@bitsofnetworks.org>

Before using a package from the cache, verify its size and checksum
against a package index, and delete the package from the cache if they
don't match.  The install process will then proceed to download the
"fixed" package as usual.

This allows to cope with remote packages that are rebuilt while keeping
the same version number as packages in the local cache.  With this change,
any outdated package in the local cache will be purged and the new version
will be downloaded instead.

This is mostly useful when running opkg on the host (e.g. in the
imagebuilder).  When running on a device, no cache is configured by
default, so this change does nothing in that case.

Fixes: FS#2690

Signed-off-by: Baptiste Jonglez <git@bitsofnetworks.org>
---
 libopkg/opkg_download.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
diff mbox series

Patch

diff --git a/libopkg/opkg_download.c b/libopkg/opkg_download.c
index 175282c..3b79856 100644
--- a/libopkg/opkg_download.c
+++ b/libopkg/opkg_download.c
@@ -263,6 +263,8 @@  int opkg_download_pkg(pkg_t * pkg, const char *dir)
 	char *stripped_filename;
 	char *urlencoded_path;
 	char *filename;
+	char *cache_name;
+	char *cache_location;
 
 	if (pkg->src == NULL) {
 		opkg_msg(ERROR,
@@ -296,6 +298,23 @@  int opkg_download_pkg(pkg_t * pkg, const char *dir)
 	sprintf_alloc(&local_filename, "%s/%s", dir, stripped_filename);
 	pkg_set_string(pkg, PKG_LOCAL_FILENAME, local_filename);
 
+	/* Invalidate/remove cached package if it has an incorrect checksum. */
+	if (conf->cache) {
+		cache_name = get_cache_filename(local_filename);
+		sprintf_alloc(&cache_location, "%s/%s", conf->cache, cache_name);
+		free(cache_name);
+		if (file_exists(cache_location)) {
+			err = opkg_verify_integrity(pkg, cache_location);
+			if (err) {
+				opkg_msg(NOTICE,
+					 "Removing %s from cache because it has incorrect checksum.\n",
+					 pkg->name);
+				unlink(cache_location);
+			}
+		}
+		free(cache_location);
+	}
+
 	err = opkg_download_cache(url, local_filename);
 	free(url);