Commit Diff


commit - 3f81ccbdc1260ec6bd1465a10f6cc3a530a991b3
commit + 82f7e4c89aedcb1b224d85a6a5f2ae78b16bc943
blob - c70734016d6453f21cfe4275495824160a6b0fd2
blob + 97afd08273862cc0e32014ef9809da10290c701e
--- lib/got_lib_hash.h
+++ lib/got_lib_hash.h
@@ -26,7 +26,12 @@ int got_parse_sha256_digest(uint8_t *, const char *);
 char *got_sha256_digest_to_str(const uint8_t *, char *, size_t);
 
 int got_parse_hash_digest(uint8_t *, const char *, enum got_hash_algorithm);
+char *got_hash_digest_to_str(const uint8_t *, char *, size_t,
+    enum got_hash_algorithm);
 
+size_t got_hash_digest_length(enum got_hash_algorithm);
+size_t got_hash_digest_string_length(enum got_hash_algorithm);
+
 struct got_hash {
 	SHA1_CTX		 sha1_ctx;
 	SHA2_CTX		 sha256_ctx;
blob - 21a5c5b28f97a2360115141697b94ec051b7d467
blob + 0544fe160bd4f810e990e5d3f7d284f68b9e7123
--- lib/hash.c
+++ lib/hash.c
@@ -146,6 +146,46 @@ got_parse_hash_digest(uint8_t *digest, const char *lin
 	}
 }
 
+char *
+got_hash_digest_to_str(const uint8_t *digest, char *buf, size_t size,
+    enum got_hash_algorithm algo)
+{
+	switch (algo) {
+	case GOT_HASH_SHA1:
+		return got_sha1_digest_to_str(digest, buf, size);
+	case GOT_HASH_SHA256:
+		return got_sha256_digest_to_str(digest, buf, size);
+	default:
+		return NULL;
+	}
+}
+
+size_t
+got_hash_digest_length(enum got_hash_algorithm algo)
+{
+	switch (algo) {
+	case GOT_HASH_SHA1:
+		return SHA1_DIGEST_LENGTH;
+	case GOT_HASH_SHA256:
+		return SHA256_DIGEST_LENGTH;
+	default:
+		return 0;
+	}
+}
+
+size_t
+got_hash_digest_string_length(enum got_hash_algorithm algo)
+{
+	switch (algo) {
+	case GOT_HASH_SHA1:
+		return SHA1_DIGEST_STRING_LENGTH;
+	case GOT_HASH_SHA256:
+		return SHA256_DIGEST_STRING_LENGTH;
+	default:
+		return 0;
+	}
+}
+
 void
 got_hash_init(struct got_hash *hash, enum got_hash_algorithm algo)
 {
blob - daec14e2a587f99d1ec39131795c9a0f39b2d29b
blob + 0c0ec97bfd02838440149781f11c2183bc65419f
--- lib/object_parse.c
+++ lib/object_parse.c
@@ -622,8 +622,10 @@ got_object_parse_commit(struct got_commit_object **com
 	const struct got_error *err = NULL;
 	enum got_hash_algorithm algo = GOT_HASH_SHA1;
 	char *s = buf;
-	size_t label_len;
+	size_t label_len, idlen;
 	ssize_t remain = (ssize_t)len;
+
+	idlen = got_hash_digest_string_length(algo);
 
 	if (remain == 0)
 		return got_error(GOT_ERR_BAD_OBJ_DATA);
@@ -635,7 +637,7 @@ got_object_parse_commit(struct got_commit_object **com
 	label_len = strlen(GOT_COMMIT_LABEL_TREE);
 	if (strncmp(s, GOT_COMMIT_LABEL_TREE, label_len) == 0) {
 		remain -= label_len;
-		if (remain < SHA1_DIGEST_STRING_LENGTH) {
+		if (remain < idlen) {
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
@@ -644,8 +646,8 @@ got_object_parse_commit(struct got_commit_object **com
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
-		remain -= SHA1_DIGEST_STRING_LENGTH;
-		s += SHA1_DIGEST_STRING_LENGTH;
+		remain -= idlen;
+		s += idlen;
 	} else {
 		err = got_error(GOT_ERR_BAD_OBJ_DATA);
 		goto done;
@@ -654,7 +656,7 @@ got_object_parse_commit(struct got_commit_object **com
 	label_len = strlen(GOT_COMMIT_LABEL_PARENT);
 	while (strncmp(s, GOT_COMMIT_LABEL_PARENT, label_len) == 0) {
 		remain -= label_len;
-		if (remain < SHA1_DIGEST_STRING_LENGTH) {
+		if (remain < idlen) {
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
@@ -663,8 +665,8 @@ got_object_parse_commit(struct got_commit_object **com
 		if (err)
 			goto done;
 
-		remain -= SHA1_DIGEST_STRING_LENGTH;
-		s += SHA1_DIGEST_STRING_LENGTH;
+		remain -= idlen;
+		s += idlen;
 	}
 
 	label_len = strlen(GOT_COMMIT_LABEL_AUTHOR);
@@ -978,7 +980,9 @@ got_object_parse_tag(struct got_tag_object **tag, uint
 	enum got_hash_algorithm algo = GOT_HASH_SHA1;
 	size_t remain = len;
 	char *s = buf;
-	size_t label_len;
+	size_t label_len, id_len;
+
+	id_len = got_hash_digest_string_length(algo);
 
 	if (remain == 0)
 		return got_error(GOT_ERR_BAD_OBJ_DATA);
@@ -990,7 +994,7 @@ got_object_parse_tag(struct got_tag_object **tag, uint
 	label_len = strlen(GOT_TAG_LABEL_OBJECT);
 	if (strncmp(s, GOT_TAG_LABEL_OBJECT, label_len) == 0) {
 		remain -= label_len;
-		if (remain < SHA1_DIGEST_STRING_LENGTH) {
+		if (remain < id_len) {
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
@@ -999,8 +1003,8 @@ got_object_parse_tag(struct got_tag_object **tag, uint
 			err = got_error(GOT_ERR_BAD_OBJ_DATA);
 			goto done;
 		}
-		remain -= SHA1_DIGEST_STRING_LENGTH;
-		s += SHA1_DIGEST_STRING_LENGTH;
+		remain -= id_len;
+		s += id_len;
 	} else {
 		err = got_error(GOT_ERR_BAD_OBJ_DATA);
 		goto done;
blob - 2a89d71d16ccc445d75c986691f8a7d73085ab30
blob + 49c486d59d228e9e64cdacaa00c1cdbcd30296d7
--- lib/pack.c
+++ lib/pack.c
@@ -326,7 +326,7 @@ checksum:
 	}
 	if (verify) {
 		got_hash_update(&ctx, h->trailer->packfile_sha1,
-		    SHA1_DIGEST_LENGTH);
+		    got_hash_digest_length(algo));
 		got_hash_final(&ctx, hash);
 		if (got_hash_cmp(&ctx, hash, h->trailer->packidx_sha1) != 0)
 			err = got_error(GOT_ERR_PACKIDX_CSUM);
@@ -667,6 +667,7 @@ got_packidx_match_id_str_prefix(struct got_object_id_q
     struct got_packidx *packidx, const char *id_str_prefix)
 {
 	const struct got_error *err = NULL;
+	enum got_hash_algorithm algo = GOT_HASH_SHA1;
 	u_int8_t id0;
 	uint32_t totobj = be32toh(packidx->hdr.fanout_table[0xff]);
 	char hex[3];
@@ -689,11 +690,12 @@ got_packidx_match_id_str_prefix(struct got_object_id_q
 		i = be32toh(packidx->hdr.fanout_table[id0 - 1]);
 	oid = &packidx->hdr.sorted_ids[i];
 	while (i < totobj && oid->sha1[0] == id0) {
-		char id_str[SHA1_DIGEST_STRING_LENGTH];
+		char id_str[GOT_OBJECT_ID_HEX_MAXLEN];
 		struct got_object_qid *qid;
 		int cmp;
 
-		if (!got_sha1_digest_to_str(oid->sha1, id_str, sizeof(id_str)))
+		if (!got_hash_digest_to_str(oid->sha1, id_str, sizeof(id_str),
+		    algo))
 		        return got_error(GOT_ERR_NO_SPACE);
 
 		cmp = strncmp(id_str, id_str_prefix, prefix_len);