Commit Diff


commit - c66ecbcb0a2490fb69c7a79d2b794fa9404c3053
commit + 8b31a0aefbf1931c90d3c61209474865e0695308
blob - 4b96e21f407d84ac399adbccb5d7e21cf86dad1f
blob + 1fe139974d76af32b2f41b225e9552489ebf6e6c
--- lib/got_lib_object_parse.h
+++ lib/got_lib_object_parse.h
@@ -28,7 +28,7 @@ struct got_commit_object *got_object_commit_alloc_part
 struct got_tree_entry *got_alloc_tree_entry_partial(void);
 
 const struct got_error *got_object_parse_commit(struct got_commit_object **,
-    char *, size_t);
+    char *, size_t, enum got_hash_algorithm);
 const struct got_error *got_object_read_commit(struct got_commit_object **, int,
     struct got_object_id *, size_t);
 
@@ -39,12 +39,12 @@ struct got_parsed_tree_entry {
 	uint8_t *id; /* Points to ID in parsed tree buffer. */
 };
 const struct got_error *got_object_parse_tree(struct got_parsed_tree_entry **,
-    size_t *, size_t *, uint8_t *, size_t);
+    size_t *, size_t *, uint8_t *, size_t, enum got_hash_algorithm);
 const struct got_error *got_object_read_tree(struct got_parsed_tree_entry **,
     size_t *, size_t *, uint8_t **, int, struct got_object_id *);
 
 const struct got_error *got_object_parse_tag(struct got_tag_object **,
-    uint8_t *, size_t);
+    uint8_t *, size_t, enum got_hash_algorithm);
 const struct got_error *got_object_read_tag(struct got_tag_object **, int,
     struct got_object_id *, size_t);
 const struct got_error *got_read_file_to_mem(uint8_t **, size_t *, FILE *);
blob - dece96df83ffd3846c7dbb45a31b59171112c076
blob + deb94475fe1cd9aa0df4c4f90358ba1fcb08d57b
--- lib/object_open_io.c
+++ lib/object_open_io.c
@@ -404,7 +404,7 @@ open_commit(struct got_commit_object **commit,
 		got_object_close(obj);
 		if (err)
 			goto done;
-		err = got_object_parse_commit(commit, buf, len);
+		err = got_object_parse_commit(commit, buf, len, id->algo);
 		free(buf);
 	} else if (err->code == GOT_ERR_NO_OBJ) {
 		int fd;
@@ -501,7 +501,7 @@ open_tree(struct got_tree_object **tree,
 		if (err)
 			goto done;
 		err = got_object_parse_tree(&entries, &nentries,
-		    &nentries_alloc, buf, len);
+		    &nentries_alloc, buf, len, id->algo);
 		if (err)
 			goto done;
 	} else if (err->code == GOT_ERR_NO_OBJ) {
@@ -657,7 +657,7 @@ open_tag(struct got_tag_object **tag, struct got_repos
 		got_object_close(obj);
 		if (err)
 			goto done;
-		err = got_object_parse_tag(tag, buf, len);
+		err = got_object_parse_tag(tag, buf, len, id->algo);
 		free(buf);
 	} else if (err->code == GOT_ERR_NO_OBJ) {
 		int fd;
blob - 85cda810ac9020610cbd80274138c726f819350c
blob + f97fe014b8a77fe7922a580d07e131817cf8074d
--- lib/object_parse.c
+++ lib/object_parse.c
@@ -617,10 +617,9 @@ got_object_commit_get_logmsg_raw(struct got_commit_obj
 
 const struct got_error *
 got_object_parse_commit(struct got_commit_object **commit, char *buf,
-    size_t len)
+    size_t len, enum got_hash_algorithm algo)
 {
 	const struct got_error *err = NULL;
-	enum got_hash_algorithm algo = GOT_HASH_SHA1;
 	char *s = buf;
 	size_t label_len, idlen;
 	ssize_t remain = (ssize_t)len;
@@ -786,7 +785,8 @@ got_object_read_commit(struct got_commit_object **comm
 
 	/* Skip object header. */
 	len -= obj->hdrlen;
-	err = got_object_parse_commit(commit, p + obj->hdrlen, len);
+	err = got_object_parse_commit(commit, p + obj->hdrlen, len,
+	    GOT_HASH_SHA1);
 done:
 	free(p);
 	if (obj)
@@ -809,7 +809,7 @@ got_object_tree_close(struct got_tree_object *tree)
 
 static const struct got_error *
 parse_tree_entry(struct got_parsed_tree_entry *pte, size_t *elen, char *buf,
-    size_t maxlen)
+    size_t maxlen, size_t idlen)
 {
 	char *p, *space;
 
@@ -833,14 +833,15 @@ parse_tree_entry(struct got_parsed_tree_entry *pte, si
 		p++;
 	}
 
-	if (*elen > maxlen || maxlen - *elen < SHA1_DIGEST_LENGTH)
+	if (*elen > maxlen || maxlen - *elen < idlen)
 		return got_error(GOT_ERR_BAD_OBJ_DATA);
 
 	pte->name = space + 1;
 	pte->namelen = strlen(pte->name);
 	buf += *elen;
 	pte->id = buf;
-	*elen += SHA1_DIGEST_LENGTH;
+	// pte->idlen = idlen;
+	*elen += idlen;
 	return NULL;
 }
 
@@ -854,7 +855,8 @@ pte_cmp(const void *pa, const void *pb)
 
 const struct got_error *
 got_object_parse_tree(struct got_parsed_tree_entry **entries, size_t *nentries,
-    size_t *nentries_alloc, uint8_t *buf, size_t len)
+    size_t *nentries_alloc, uint8_t *buf, size_t len,
+    enum got_hash_algorithm algo)
 {
 	const struct got_error *err = NULL;
 	size_t remain = len;
@@ -881,7 +883,8 @@ got_object_parse_tree(struct got_parsed_tree_entry **e
 		}
 
 		pte = &(*entries)[*nentries];
-		err = parse_tree_entry(pte, &elen, buf, remain);
+		err = parse_tree_entry(pte, &elen, buf, remain,
+		    got_hash_digest_length(algo));
 		if (err)
 			goto done;
 		buf += elen;
@@ -951,7 +954,7 @@ got_object_read_tree(struct got_parsed_tree_entry **en
 	/* Skip object header. */
 	len -= obj->hdrlen;
 	err = got_object_parse_tree(entries, nentries, nentries_alloc,
-	    *p + obj->hdrlen, len);
+	    *p + obj->hdrlen, len, GOT_HASH_SHA1);
 done:
 	if (obj)
 		got_object_close(obj);
@@ -974,10 +977,10 @@ got_object_tag_close(struct got_tag_object *tag)
 }
 
 const struct got_error *
-got_object_parse_tag(struct got_tag_object **tag, uint8_t *buf, size_t len)
+got_object_parse_tag(struct got_tag_object **tag, uint8_t *buf, size_t len,
+    enum got_hash_algorithm algo)
 {
 	const struct got_error *err = NULL;
-	enum got_hash_algorithm algo = GOT_HASH_SHA1;
 	size_t remain = len;
 	char *s = buf;
 	size_t label_len, id_len;
@@ -1193,7 +1196,8 @@ got_object_read_tag(struct got_tag_object **tag, int f
 
 	/* Skip object header. */
 	len -= obj->hdrlen;
-	err = got_object_parse_tag(tag, p + obj->hdrlen, len);
+	err = got_object_parse_tag(tag, p + obj->hdrlen, len,
+	    GOT_HASH_SHA1);
 done:
 	free(p);
 	if (obj)
blob - ca7cac34bcd12c5df8c223e410917d4fb6bb151a
blob + 06caa68133ea0151e72d46cf3e44f50b61304883
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
@@ -142,7 +142,7 @@ open_commit(struct got_commit_object **commit, struct 
 
 	obj->size = len;
 
-	err = got_object_parse_commit(commit, buf, len);
+	err = got_object_parse_commit(commit, buf, len, GOT_HASH_SHA1);
 done:
 	got_object_close(obj);
 	free(buf);
@@ -212,7 +212,7 @@ open_tree(uint8_t **buf, struct got_parsed_tree_entry 
 	obj->size = len;
 
 	err = got_object_parse_tree(entries, nentries, nentries_alloc,
-	    *buf, len);
+	    *buf, len, GOT_HASH_SHA1);
 done:
 	got_object_close(obj);
 	if (err) {
@@ -411,7 +411,7 @@ tag_request(struct imsg *imsg, struct imsgbuf *ibuf, s
 		goto done;
 
 	obj->size = len;
-	err = got_object_parse_tag(&tag, buf, len);
+	err = got_object_parse_tag(&tag, buf, len, GOT_HASH_SHA1);
 	if (err)
 		goto done;
 
@@ -1437,7 +1437,8 @@ enumeration_request(struct imsg *imsg, struct imsgbuf 
 			if (err)
 				goto done;
 			obj->size = len;
-			err = got_object_parse_tag(&tag, buf, len);
+			err = got_object_parse_tag(&tag, buf, len,
+			    GOT_HASH_SHA1);
 			if (err) {
 				free(buf);
 				goto done;