Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add package validation function.
Vsevolod Stakhov committed 11 years ago
commit e3f0269dd653f27b903e14536ffabfbe33ecfce0
parent 6dae1d9
3 files changed +48 -1
modified libpkg/pkg.c
@@ -1463,6 +1463,46 @@ pkg_open2(struct pkg **pkg_p, struct archive **a, struct archive_entry **ae,
}

int
+
pkg_validate(struct pkg *pkg)
+
{
+
	const char *uid, *md;
+

+
	assert(pkg != NULL);
+

+
	pkg_get(pkg, PKG_UNIQUEID, &uid, PKG_DIGEST, &md);
+

+
	if (uid == NULL) {
+
		/* Generate uid from name and origin */
+
		const char *origin, *name;
+
		char *out;
+
		size_t outlen;
+

+
		pkg_get(pkg, PKG_NAME, &name, PKG_ORIGIN, &origin);
+
		if (name == NULL || origin == NULL) {
+
			/* Our package is invalid */
+
			return (EPKG_FATAL);
+
		}
+

+
		outlen = strlen(name) + strlen(origin) + sizeof("~");
+
		out = malloc(outlen);
+
		if (out == NULL) {
+
			pkg_emit_errno("malloc", "pkg_validate");
+
			return (EPKG_FATAL);
+
		}
+

+
		snprintf(out, outlen, "%s~%s", name, origin);
+
		pkg_set(pkg, PKG_UNIQUEID, out);
+
	}
+

+
	if (md == NULL || !pkg_checksum_is_valid(md, strlen(md))) {
+
		/* Calculate new digest */
+
		return (pkg_checksum_calculate(pkg, NULL));
+
	}
+

+
	return (EPKG_OK);
+
}
+

+
int
pkg_copy_tree(struct pkg *pkg, const char *src, const char *dest)
{
	struct packing *pack;
modified libpkg/pkg_jobs.c
@@ -1289,7 +1289,7 @@ pkg_jobs_find_remote_pattern(struct pkg_jobs *j, struct job_pattern *jp,
		pkg_manifest_keys_new(&keys);
		if (pkg_open(&pkg, jp->path, keys, PKG_OPEN_MANIFEST_ONLY) != EPKG_OK)
			rc = EPKG_FATAL;
-
		else {
+
		else if (pkg_validate(pkg) == EPKG_OK) {
			if (j->type == PKG_JOBS_UPGRADE) {
				pkg_get(pkg, PKG_NAME, &pkgname);
				jfp.match = MATCH_EXACT;
@@ -1307,6 +1307,11 @@ pkg_jobs_find_remote_pattern(struct pkg_jobs *j, struct job_pattern *jp,
			unit->jp = jp;
			*got_local = true;
		}
+
		else {
+
			pkg_emit_error("cannot load %s: invalid format",
+
					jfp.pattern);
+
			rc = EPKG_FATAL;
+
		}
		pkg_manifest_keys_free(keys);
	}

modified libpkg/private/pkg.h
@@ -491,6 +491,8 @@ int pkg_delete_user_group(struct pkgdb *db, struct pkg *pkg);
int pkg_open2(struct pkg **p, struct archive **a, struct archive_entry **ae,
	      const char *path, struct pkg_manifest_key *keys, int flags, int fd);

+
int pkg_validate(struct pkg *pkg);
+

void pkg_list_free(struct pkg *, pkg_list);

int pkg_dep_new(struct pkg_dep **);