commit 8b31a0aefbf1931c90d3c61209474865e0695308 from: Omar Polo date: Sun Feb 12 11:16:30 2023 UTC bubble up the algo argument 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;