Download raw body.
do not hardcode digest length when parsing packed trees
the subject says it all. there are a few upcoming diff where I'm
replacing SHA1_DIGEST{,_STRING}_LENGTH with the right length derived
with got_hash_digest{,_string}_length() but this is a bit more delicate.
I know that this is a performance-sensitive area and that's why i'm
passing the idlen instead of having the function computing it. to be
fair though i haven't done any benchmark.
ok?
diff -s /home/op/w/got
commit - 4239df3cca84ef6d17b350804eab03fa39f41d20
path + /home/op/w/got (staged changes)
blob - 746e561381b85c24e2b02e2298cff0dbbf3b9912
blob + f871e8cb69954a7bce76347100e63673a2c8fd95
--- lib/got_lib_object_parse.h
+++ lib/got_lib_object_parse.h
@@ -33,7 +33,7 @@ struct got_parsed_tree_entry {
uint8_t *id; /* Points to ID in parsed tree buffer. */
};
const struct got_error *got_object_parse_tree_entry(
- struct got_parsed_tree_entry *, size_t *, char *, size_t);
+ struct got_parsed_tree_entry *, size_t *, char *, size_t, size_t);
const struct got_error *got_object_parse_tree(struct got_parsed_tree_entry **,
size_t *, size_t *, uint8_t *, size_t);
const struct got_error *got_object_read_tree(struct got_parsed_tree_entry **,
blob - 2309e009560dfaa866d6ee8a0a268e8dbc61a114
blob + f3cba911b4349a33264333ee8d8e133f09221710
--- lib/object_parse.c
+++ lib/object_parse.c
@@ -762,7 +762,7 @@ got_object_tree_close(struct got_tree_object *tree)
const struct got_error *
got_object_parse_tree_entry(struct got_parsed_tree_entry *pte, size_t *elen,
- char *buf, size_t maxlen)
+ char *buf, size_t maxlen, size_t idlen)
{
char *p, *space;
@@ -786,14 +786,14 @@ got_object_parse_tree_entry(struct got_parsed_tree_ent
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;
+ *elen += idlen;
return NULL;
}
@@ -810,11 +810,13 @@ got_object_parse_tree(struct got_parsed_tree_entry **e
size_t *nentries_alloc, uint8_t *buf, size_t len)
{
const struct got_error *err = NULL;
- size_t remain = len;
+ size_t idlen, remain = len;
const size_t nalloc = 16;
struct got_parsed_tree_entry *pte;
int i;
+ idlen = got_hash_digest_length(GOT_HASH_SHA1);
+
*nentries = 0;
if (remain == 0)
return NULL; /* tree is empty */
@@ -834,7 +836,8 @@ got_object_parse_tree(struct got_parsed_tree_entry **e
}
pte = &(*entries)[*nentries];
- err = got_object_parse_tree_entry(pte, &elen, buf, remain);
+ err = got_object_parse_tree_entry(pte, &elen, buf, remain,
+ idlen);
if (err)
goto done;
buf += elen;
blob - b4ec204772c2f95248eaebb7f4c5d724d535c17b
blob + e55cdb411d26905c5b5b6fcb06e7fe199e96521f
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
@@ -40,6 +40,7 @@
#include "got_lib_delta.h"
#include "got_lib_delta_cache.h"
+#include "got_lib_hash.h"
#include "got_lib_object.h"
#include "got_lib_object_qid.h"
#include "got_lib_object_cache.h"
@@ -452,7 +453,7 @@ tree_path_changed(int *changed, uint8_t **buf1, size_t
const struct got_error *err = NULL;
struct got_parsed_tree_entry pte1, pte2;
const char *seg, *s;
- size_t seglen;
+ size_t seglen, idlen;
size_t remain1 = *len1, remain2 = *len2, elen;
uint8_t *next_entry1 = *buf1;
uint8_t *next_entry2 = *buf2;
@@ -462,6 +463,8 @@ tree_path_changed(int *changed, uint8_t **buf1, size_t
*changed = 0;
+ idlen = got_hash_digest_length(GOT_HASH_SHA1);
+
/* We not do support comparing the root path. */
if (got_path_is_root_dir(path))
return got_error_path(path, GOT_ERR_BAD_PATH);
@@ -492,7 +495,7 @@ tree_path_changed(int *changed, uint8_t **buf1, size_t
*/
while (remain1 > 0) {
err = got_object_parse_tree_entry(&pte1, &elen,
- next_entry1, remain1);
+ next_entry1, remain1, idlen);
if (err)
return err;
next_entry1 += elen;
@@ -516,7 +519,7 @@ tree_path_changed(int *changed, uint8_t **buf1, size_t
while (remain2 > 0) {
err = got_object_parse_tree_entry(&pte2, &elen,
- next_entry2, remain2);
+ next_entry2, remain2, idlen);
if (err)
return err;
next_entry2 += elen;
do not hardcode digest length when parsing packed trees