commit 243943f63dac33bd84f18ae5c81cff8f79d4b29f from: Omar Polo date: Fri Jul 12 14:09:18 2024 UTC do not hardcode digest length (cont) commit - 8fdd8178257524a92d71c6b4a52984f8974f04df commit + 243943f63dac33bd84f18ae5c81cff8f79d4b29f blob - 3a7d1e49be0e4a6882f9313120d6973a76f063f9 blob + 0aafbffd522a53c07caf5219f5e6e6133d39d5eb --- lib/object_parse.c +++ lib/object_parse.c @@ -576,8 +576,10 @@ got_object_parse_commit(struct got_commit_object **com { const struct got_error *err = NULL; char *s = buf; - size_t label_len; + size_t label_len, digest_string_len; ssize_t remain = (ssize_t)len; + + digest_string_len = got_hash_digest_string_length(algo); if (remain == 0) return got_error(GOT_ERR_BAD_OBJ_DATA); @@ -589,7 +591,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 < digest_string_len) { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; } @@ -598,8 +600,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 -= digest_string_len; + s += digest_string_len; } else { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; @@ -608,7 +610,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 < digest_string_len) { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; } @@ -617,8 +619,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 -= digest_string_len; + s += digest_string_len; } label_len = strlen(GOT_COMMIT_LABEL_AUTHOR); @@ -811,12 +813,12 @@ got_object_parse_tree(struct got_parsed_tree_entry **e enum got_hash_algorithm algo) { const struct got_error *err = NULL; - size_t idlen, remain = len; + size_t digest_len, remain = len; const size_t nalloc = 16; struct got_parsed_tree_entry *pte; int i; - idlen = got_hash_digest_length(algo); + digest_len = got_hash_digest_length(algo); *nentries = 0; if (remain == 0) @@ -838,7 +840,7 @@ got_object_parse_tree(struct got_parsed_tree_entry **e pte = &(*entries)[*nentries]; err = got_object_parse_tree_entry(pte, &elen, buf, remain, - idlen); + digest_len); if (err) goto done; buf += elen; @@ -937,7 +939,9 @@ got_object_parse_tag(struct got_tag_object **tag, uint const struct got_error *err = NULL; size_t remain = len; char *s = buf; - size_t label_len; + size_t label_len, digest_string_len; + + digest_string_len = got_hash_digest_string_length(algo); if (remain == 0) return got_error(GOT_ERR_BAD_OBJ_DATA); @@ -949,7 +953,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 < digest_string_len) { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; } @@ -958,8 +962,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 -= digest_string_len; + s += digest_string_len; } else { err = got_error(GOT_ERR_BAD_OBJ_DATA); goto done; blob - 5d128736fd8cc8b24a9e2f8fd6edd0d243752fcc blob + 2a64424df931938a52b2dbc73af82948e7aec145 --- lib/pack_index.c +++ lib/pack_index.c @@ -157,11 +157,14 @@ read_packed_object(struct got_pack *pack, struct got_i const char *obj_label; size_t mapoff = obj->off; struct got_inflate_checksum csum; + size_t digest_len; memset(&csum, 0, sizeof(csum)); csum.input_ctx = pack_hash_ctx; csum.input_crc = &obj->crc; + digest_len = got_hash_digest_length(pack->algo); + err = got_pack_parse_object_type_and_size(&obj->type, &obj->size, &obj->tslen, pack, obj->off); if (err) @@ -239,19 +242,19 @@ read_packed_object(struct got_pack *pack, struct got_i free(data); break; case GOT_OBJ_TYPE_REF_DELTA: - memset(obj->id.sha1, 0xff, SHA1_DIGEST_LENGTH); + memset(obj->id.sha1, 0xff, digest_len); if (pack->map) { - if (mapoff + SHA1_DIGEST_LENGTH >= pack->filesize) { + if (mapoff + digest_len >= pack->filesize) { err = got_error(GOT_ERR_BAD_PACKFILE); break; } memcpy(obj->delta.ref.ref_id.sha1, pack->map + mapoff, - SHA1_DIGEST_LENGTH); + digest_len); obj->crc = crc32(obj->crc, pack->map + mapoff, - SHA1_DIGEST_LENGTH); + digest_len); got_hash_update(pack_hash_ctx, pack->map + mapoff, - SHA1_DIGEST_LENGTH); - mapoff += SHA1_DIGEST_LENGTH; + digest_len); + mapoff += digest_len; err = got_inflate_to_mem_mmap(NULL, &datalen, &obj->len, &csum, pack->map, mapoff, pack->filesize - mapoff); @@ -259,7 +262,7 @@ read_packed_object(struct got_pack *pack, struct got_i break; } else { n = read(pack->fd, obj->delta.ref.ref_id.sha1, - SHA1_DIGEST_LENGTH); + digest_len); if (n == -1) { err = got_error_from_errno("read"); break; @@ -269,18 +272,18 @@ read_packed_object(struct got_pack *pack, struct got_i break; } obj->crc = crc32(obj->crc, obj->delta.ref.ref_id.sha1, - SHA1_DIGEST_LENGTH); + digest_len); got_hash_update(pack_hash_ctx, - obj->delta.ref.ref_id.sha1, SHA1_DIGEST_LENGTH); + obj->delta.ref.ref_id.sha1, digest_len); err = got_inflate_to_mem_fd(NULL, &datalen, &obj->len, &csum, obj->size, pack->fd); if (err) break; } - obj->len += SHA1_DIGEST_LENGTH; + obj->len += digest_len; break; case GOT_OBJ_TYPE_OFFSET_DELTA: - memset(obj->id.sha1, 0xff, SHA1_DIGEST_LENGTH); + memset(obj->id.sha1, 0xff, digest_len); err = got_pack_parse_offset_delta(&obj->delta.ofs.base_offset, &obj->delta.ofs.base_offsetlen, pack, obj->off, obj->tslen); blob - e25d7c6f309c6ab9ea5bd88e7e3dceab290ba031 blob + adbe1b7e6e30b6571e3c7c1324bf23fbe0132c21 --- lib/repository.c +++ lib/repository.c @@ -1964,15 +1964,16 @@ got_repo_match_object_id_prefix(struct got_object_id * { const struct got_error *err = NULL; char *path_objects = NULL, *object_dir = NULL; - size_t len; + size_t len, digest_string_len; int i; *id = NULL; path_objects = got_repo_get_path_objects(repo); + digest_string_len = got_hash_digest_string_length(repo->algo); len = strlen(id_str_prefix); - if (len > SHA1_DIGEST_STRING_LENGTH - 1) { + if (len > digest_string_len - 1) { err = got_error_path(id_str_prefix, GOT_ERR_BAD_OBJ_ID_STR); goto done; }