Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
pkg_checksum: speed up generation of package checksum
Baptiste Daroussin committed 1 year ago
commit 81c1ce0fc3e237d8dd74702e42ff28d5e40bd719
parent 136b196
1 file changed +48 -29
modified libpkg/pkg_checksum.c
@@ -43,7 +43,22 @@
#define PKG_CHECKSUM_BLAKE2S_LEN (BLAKE2S_OUTBYTES * 8 / 5 + sizeof("100") * 2 + 2)
#define PKG_CHECKSUM_CUR_VERSION 2

-
typedef void (*pkg_checksum_hash_func)(kvlist_t *entries,
+
struct kv {
+
	const char *key;
+
	const char *value;
+
};
+
typedef tll(struct kv *) kv_t;
+

+
struct kv *
+
kv_new(const char *k, const char *v)
+
{
+
	struct kv *kv = xmalloc(sizeof(*kv));
+
	kv->key = k;
+
	kv->value = v;
+
	return (kv);
+
}
+

+
typedef void (*pkg_checksum_hash_func)(kv_t *entries,
				unsigned char **out, size_t *outlen);
typedef void (*pkg_checksum_hash_bulk_func)(const unsigned char *in, size_t inlen,
				unsigned char **out, size_t *outlen);
@@ -53,19 +68,19 @@ typedef void (*pkg_checksum_encode_func)(unsigned char *in, size_t inlen,
typedef void (*pkg_checksum_hash_file_func)(int fd, unsigned char **out,
    size_t *outlen);

-
static void pkg_checksum_hash_sha256(kvlist_t *entries,
+
static void pkg_checksum_hash_sha256(kv_t *entries,
				unsigned char **out, size_t *outlen);
static void pkg_checksum_hash_sha256_bulk(const unsigned char *in, size_t inlen,
				unsigned char **out, size_t *outlen);
static void pkg_checksum_hash_sha256_file(int fd, unsigned char **out,
    size_t *outlen);
-
static void pkg_checksum_hash_blake2(kvlist_t *entries,
+
static void pkg_checksum_hash_blake2(kv_t *entries,
				unsigned char **out, size_t *outlen);
static void pkg_checksum_hash_blake2_bulk(const unsigned char *in, size_t inlen,
				unsigned char **out, size_t *outlen);
static void pkg_checksum_hash_blake2_file(int fd, unsigned char **out,
    size_t *outlen);
-
static void pkg_checksum_hash_blake2s(kvlist_t *entries,
+
static void pkg_checksum_hash_blake2s(kv_t *entries,
				unsigned char **out, size_t *outlen);
static void pkg_checksum_hash_blake2s_bulk(const unsigned char *in, size_t inlen,
				unsigned char **out, size_t *outlen);
@@ -150,8 +165,8 @@ static const struct _pkg_cksum_type {
};

static int
-
pkg_checksum_entry_cmp(struct pkg_kv *e1,
-
	struct pkg_kv *e2)
+
pkg_checksum_entry_cmp(struct kv *e1,
+
	struct kv *e2)
{
	int r;

@@ -186,12 +201,14 @@ pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,
	unsigned char *bdigest;
	char *olduid;
	size_t blen;
-
	kvlist_t entries = tll_init();
+
	kv_t entries = tll_init();
+
	charv_t tofree;
	struct pkg_option *option = NULL;
	struct pkg_dep *dep = NULL;
	struct pkg_file *f = NULL;
	int i;
	bool is_group = false;
+
	vec_init(&tofree);

	if (pkg == NULL || type >= PKG_HASH_TYPE_UNKNOWN ||
					destlen < checksum_types[type].hlen)
@@ -199,67 +216,67 @@ pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,
	if (pkg_type(pkg) == PKG_GROUP_REMOTE || pkg_type(pkg) == PKG_GROUP_INSTALLED)
		is_group = true;

-
	tll_push_back(entries, pkg_kv_new("name", pkg->name));
+
	tll_push_back(entries, kv_new("name", pkg->name));
	if (!is_group)
-
		tll_push_back(entries, pkg_kv_new("origin", pkg->origin));
+
		tll_push_back(entries, kv_new("origin", pkg->origin));
	if (inc_version && !is_group)
-
		tll_push_back(entries, pkg_kv_new("version", pkg->version));
+
		tll_push_back(entries, kv_new("version", pkg->version));
	if (!is_group)
-
		tll_push_back(entries, pkg_kv_new("arch", pkg->altabi));
+
		tll_push_back(entries, kv_new("arch", pkg->altabi));

	while (pkg_options(pkg, &option) == EPKG_OK) {
-
		tll_push_back(entries, pkg_kv_new(option->key, option->value));
+
		tll_push_back(entries, kv_new(option->key, option->value));
	}

	tll_foreach(pkg->shlibs_required, s) {
-
		tll_push_back(entries, pkg_kv_new("required_shlib", s->item));
+
		tll_push_back(entries, kv_new("required_shlib", s->item));
	}

	tll_foreach(pkg->shlibs_provided, s) {
-
		tll_push_back(entries, pkg_kv_new("provided_shlib", s->item));
+
		tll_push_back(entries, kv_new("provided_shlib", s->item));
	}

	tll_foreach(pkg->users, u) {
-
		tll_push_back(entries, pkg_kv_new("user", u->item));
+
		tll_push_back(entries, kv_new("user", u->item));
	}

	tll_foreach(pkg->groups, g) {
-
		tll_push_back(entries, pkg_kv_new("group", g->item));
+
		tll_push_back(entries, kv_new("group", g->item));
	}

	while (pkg_deps(pkg, &dep) == EPKG_OK) {
		if (is_group) {
-
			tll_push_back(entries, pkg_kv_new("depend", dep->name));
+
			tll_push_back(entries, kv_new("depend", dep->name));
		} else {
			xasprintf(&olduid, "%s~%s", dep->name, dep->origin);
-
			tll_push_back(entries, pkg_kv_new("depend", olduid));
-
			free(olduid);
+
			tll_push_back(entries, kv_new("depend", olduid));
+
			vec_push(&tofree, olduid);
		}
	}

	tll_foreach(pkg->provides, p) {
-
		tll_push_back(entries, pkg_kv_new("provide", p->item));
+
		tll_push_back(entries, kv_new("provide", p->item));
	}

	tll_foreach(pkg->requires, r) {
-
		tll_push_back(entries, pkg_kv_new("require", r->item));
+
		tll_push_back(entries, kv_new("require", r->item));
	}

	if (inc_scripts) {
		for (int i = 0; i < PKG_NUM_SCRIPTS; i++) {
			if (pkg->scripts[i] != NULL) {
				fflush(pkg->scripts[i]->fp);
-
				tll_push_back(entries, pkg_kv_new("script", pkg->scripts[i]->buf));
+
				tll_push_back(entries, kv_new("script", pkg->scripts[i]->buf));
			}
		}
		for (int i = 0; i < PKG_NUM_LUA_SCRIPTS; i++) {
			tll_foreach(pkg->lua_scripts[i], s)
-
				tll_push_back(entries, pkg_kv_new("lua_script", s->item));
+
				tll_push_back(entries, kv_new("lua_script", s->item));
		}
	}

	while (pkg_files(pkg, &f) == EPKG_OK) {
-
		tll_push_back(entries, pkg_kv_new(f->path, f->sum));
+
		tll_push_back(entries, kv_new(f->path, f->sum));
	}

	/* Sort before hashing */
@@ -267,7 +284,8 @@ pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,

	checksum_types[type].hfunc(&entries, &bdigest, &blen);
	if (blen == 0 || bdigest == NULL) {
-
		tll_free_and_free(entries, pkg_kv_free);
+
		tll_free_and_free(entries, free);
+
		vec_free_and_free(&tofree, free);
		return (EPKG_FATAL);
	}

@@ -284,7 +302,8 @@ pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,
	}

	free(bdigest);
-
	tll_free_and_free(entries, pkg_kv_free);
+
	tll_free_and_free(entries, free);
+
	vec_free_and_free(&tofree, free);

	return (EPKG_OK);
}
@@ -354,7 +373,7 @@ pkg_checksum_get_type(const char *cksum, size_t clen __unused)
}

static void
-
pkg_checksum_hash_sha256(kvlist_t *entries,
+
pkg_checksum_hash_sha256(kv_t *entries,
		unsigned char **out, size_t *outlen)
{
	SHA256_CTX sign_ctx;
@@ -405,7 +424,7 @@ pkg_checksum_hash_sha256_file(int fd, unsigned char **out, size_t *outlen)
}

static void
-
pkg_checksum_hash_blake2(kvlist_t *entries,
+
pkg_checksum_hash_blake2(kv_t *entries,
		unsigned char **out, size_t *outlen)
{
	blake2b_state st;
@@ -453,7 +472,7 @@ pkg_checksum_hash_blake2_file(int fd, unsigned char **out, size_t *outlen)
}

static void
-
pkg_checksum_hash_blake2s(kvlist_t *entries,
+
pkg_checksum_hash_blake2s(kv_t *entries,
		unsigned char **out, size_t *outlen)
{
	blake2s_state st;