summaryrefslogtreecommitdiff
path: root/sha1-file.c
diff options
context:
space:
mode:
authorbrian m. carlson <sandals@crustytoothpaste.net>2020-02-22 20:17:27 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-02-24 17:33:21 (GMT)
commit768e30ea27c58aa69893e10b96ba5ba5680dc3cf (patch)
treeeed6e6b8db5bcef9ee99aa7e1fd675da3e6e7e54 /sha1-file.c
parent207899137dd75916f65bb9988ccf0559760427d6 (diff)
downloadgit-768e30ea27c58aa69893e10b96ba5ba5680dc3cf.zip
git-768e30ea27c58aa69893e10b96ba5ba5680dc3cf.tar.gz
git-768e30ea27c58aa69893e10b96ba5ba5680dc3cf.tar.bz2
hash: implement and use a context cloning function
For all of our SHA-1 implementations and most of our SHA-256 implementations, the hash context we use is a real struct. For these implementations, it's possible to copy a hash context by making a copy of the struct. However, for our libgcrypt implementation, our hash context is a pointer. Consequently, copying it does not lead to an independent hash context like we intended. Fortunately, however, libgcrypt provides us with a handy function to copy hash contexts. Let's add a cloning function to the hash algorithm API, and use it in the one place we need to make a hash context copy. With this change, our libgcrypt SHA-256 implementation is fully functional with all of our other hash implementations. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1-file.c')
-rw-r--r--sha1-file.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sha1-file.c b/sha1-file.c
index d785de8..c36ca5a 100644
--- a/sha1-file.c
+++ b/sha1-file.c
@@ -74,6 +74,11 @@ static void git_hash_sha1_init(git_hash_ctx *ctx)
git_SHA1_Init(&ctx->sha1);
}
+static void git_hash_sha1_clone(git_hash_ctx *dst, const git_hash_ctx *src)
+{
+ git_SHA1_Clone(&dst->sha1, &src->sha1);
+}
+
static void git_hash_sha1_update(git_hash_ctx *ctx, const void *data, size_t len)
{
git_SHA1_Update(&ctx->sha1, data, len);
@@ -90,6 +95,11 @@ static void git_hash_sha256_init(git_hash_ctx *ctx)
git_SHA256_Init(&ctx->sha256);
}
+static void git_hash_sha256_clone(git_hash_ctx *dst, const git_hash_ctx *src)
+{
+ git_SHA256_Clone(&dst->sha256, &src->sha256);
+}
+
static void git_hash_sha256_update(git_hash_ctx *ctx, const void *data, size_t len)
{
git_SHA256_Update(&ctx->sha256, data, len);
@@ -105,6 +115,11 @@ static void git_hash_unknown_init(git_hash_ctx *ctx)
BUG("trying to init unknown hash");
}
+static void git_hash_unknown_clone(git_hash_ctx *dst, const git_hash_ctx *src)
+{
+ BUG("trying to clone unknown hash");
+}
+
static void git_hash_unknown_update(git_hash_ctx *ctx, const void *data, size_t len)
{
BUG("trying to update unknown hash");
@@ -123,6 +138,7 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
0,
0,
git_hash_unknown_init,
+ git_hash_unknown_clone,
git_hash_unknown_update,
git_hash_unknown_final,
NULL,
@@ -136,6 +152,7 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
GIT_SHA1_HEXSZ,
GIT_SHA1_BLKSZ,
git_hash_sha1_init,
+ git_hash_sha1_clone,
git_hash_sha1_update,
git_hash_sha1_final,
&empty_tree_oid,
@@ -149,6 +166,7 @@ const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
GIT_SHA256_HEXSZ,
GIT_SHA256_BLKSZ,
git_hash_sha256_init,
+ git_hash_sha256_clone,
git_hash_sha256_update,
git_hash_sha256_final,
&empty_tree_oid_sha256,