commit - 87a4b05fb8b2ad9ea533436eaf47108b48ba66cf
commit + cf67c0d95b97d5a74575e1061be649435bd88489
blob - 9ea57251b69bdb5700e0fd371705a2c201e32769
blob + adfa664a9f434ac0bafc98634b7050c5a28bdf11
--- include/got_object.h
+++ include/got_object.h
const char *got_object_tag_get_message(struct got_tag_object *);
const struct got_error *got_object_commit_add_parent(struct got_commit_object *,
- const char *);
+ const char *, int);
/* Create a new tag object in the repository. */
const struct got_error *got_object_tag_create(struct got_object_id **,
blob - 4b96e21f407d84ac399adbccb5d7e21cf86dad1f
blob + 4bb7ecf2163c2d7807d4697feab533b7c1e26e1a
--- lib/got_lib_object_parse.h
+++ lib/got_lib_object_parse.h
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, int);
const struct got_error *got_object_read_commit(struct got_commit_object **, int,
struct got_object_id *, size_t);
blob - d55b66e81877a6e05c07a226ffbd0453235a5780
blob + 294a0d3507c5fa97bca600bd2835cdaf5257d91f
--- lib/object_parse.c
+++ lib/object_parse.c
const struct got_error *
got_object_commit_add_parent(struct got_commit_object *commit,
- const char *id_str)
+ const char *id_str, int algo)
{
const struct got_error *err = NULL;
struct got_object_qid *qid;
if (err)
return err;
- if (!got_parse_sha1_digest(qid->id.hash, id_str)) {
+ if (!got_parse_hash_digest(qid->id.hash, id_str, algo, NULL)) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
got_object_qid_free(qid);
return err;
}
+ qid->id.algo = algo;
STAILQ_INSERT_TAIL(&commit->parent_ids, qid, entry);
commit->nparents++;
const struct got_error *
got_object_parse_commit(struct got_commit_object **commit, char *buf,
- size_t len)
+ size_t len, int algo)
{
const struct got_error *err = NULL;
char *s = buf;
size_t label_len;
+ size_t digest_strlen;
ssize_t remain = (ssize_t)len;
+
+ if (algo == GOT_HASH_SHA256)
+ digest_strlen = SHA256_DIGEST_STRING_LENGTH;
+ else
+ digest_strlen = SHA1_DIGEST_STRING_LENGTH;
if (remain == 0)
return got_error(GOT_ERR_BAD_OBJ_DATA);
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 < digest_strlen) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
s += label_len;
- if (!got_parse_sha1_digest((*commit)->tree_id->hash, s)) {
+ if (!got_parse_hash_digest((*commit)->tree_id->hash, s,
+ algo, NULL)) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
- remain -= SHA1_DIGEST_STRING_LENGTH;
- s += SHA1_DIGEST_STRING_LENGTH;
+ remain -= digest_strlen;
+ s += digest_strlen;
} else {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
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 < digest_strlen) {
err = got_error(GOT_ERR_BAD_OBJ_DATA);
goto done;
}
s += label_len;
- err = got_object_commit_add_parent(*commit, s);
+ err = got_object_commit_add_parent(*commit, s, algo);
if (err)
goto done;
- remain -= SHA1_DIGEST_STRING_LENGTH;
- s += SHA1_DIGEST_STRING_LENGTH;
+ remain -= digest_strlen;
+ s += digest_strlen;
}
label_len = strlen(GOT_COMMIT_LABEL_AUTHOR);
uint8_t *p;
struct got_inflate_checksum csum;
SHA1_CTX sha1_ctx;
+ SHA2_CTX sha256_ctx;
struct got_object_id id;
- SHA1Init(&hash_ctx);
memset(&csum, 0, sizeof(csum));
- csum.output_hash = &hash_ctx;
+ id.algo = expected_id->algo;
+ if (expected_id->algo == GOT_HASH_SHA256) {
+ SHA256Init(&sha256_ctx);
+ csum.output_sha256 = &sha256_ctx;
+ } else {
+ SHA1Init(&sha1_ctx);
+ csum.output_sha1 = &sha1_ctx;
+ }
err = got_inflate_to_mem_fd(&p, &len, NULL, &csum, expected_size, fd);
if (err)
return err;
- SHA1Final(id.hash, &sha1_ctx);
+ if (expected_id->algo == GOT_HASH_SHA256)
+ SHA256Final(id.hash, &sha256_ctx);
+ else
+ SHA1Final(id.hash, &sha1_ctx);
+
if (got_object_id_cmp(expected_id, &id) != 0) {
err = got_error_checksum(expected_id);
goto done;
/* 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,
+ expected_id->algo);
done:
free(p);
if (obj)
blob - ca7cac34bcd12c5df8c223e410917d4fb6bb151a
blob + a7bc1b886b3ad07fbe8c6c1b889b4c23b1c07c28
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
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);