"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
prepare got_object_parse_tree for sha256
To:
gameoftrees@openbsd.org
Date:
Fri, 12 Jul 2024 17:46:20 +0200

Download raw body.

Thread
  • Omar Polo:

    prepare got_object_parse_tree for sha256

This is another delicate diff.  Since got_object_parse_tree_entry is a
function that has to be as fast as possible, my idea to handle both
types of hashes is to keep track of the hashing algorithm used and the
length of the digest, and then eventually adding a "gap" when sending in
privsep.c so that the receiving side can always read a fixed-size
buffer.  This is to avoid doing memcpy() in the parsing function.

ok?

diff /home/op/w/got
commit - dd96e029a8f0911725a77e589c7b86b2969bc651
path + /home/op/w/got
blob - 871d597f71d021f4f8459895c0dd10256623af34
file + lib/dial.c
--- lib/dial.c
+++ lib/dial.c
@@ -39,6 +39,7 @@
 
 #include "got_lib_dial.h"
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_privsep.h"
 #include "got_dial.h"
blob - 05babbcb9ae24c765e1ed59bf0cb51d45de5aec7
file + lib/got_lib_object_parse.h
--- lib/got_lib_object_parse.h
+++ lib/got_lib_object_parse.h
@@ -31,9 +31,11 @@ struct got_parsed_tree_entry {
 	size_t namelen; /* strlen(name) */
 	mode_t mode; /* Mode parsed from tree buffer. */
 	uint8_t *id; /* Points to ID in parsed tree buffer. */
+	size_t idlen;
+	int algo;
 };
 const struct got_error *got_object_parse_tree_entry(
-    struct got_parsed_tree_entry *, size_t *, char *, size_t, size_t);
+    struct got_parsed_tree_entry *, size_t *, char *, size_t, size_t, enum got_hash_algorithm);
 const struct got_error *got_object_parse_tree(struct got_parsed_tree_entry **,
     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 **,
blob - 9365381c6d173fbb3fedfb6b7d428db95f6e93f5
file + lib/got_lib_privsep.h
--- lib/got_lib_privsep.h
+++ lib/got_lib_privsep.h
@@ -260,7 +260,8 @@ struct got_imsg_commit_object {
 } __attribute__((__packed__));
 
 struct got_imsg_tree_entry {
-	char id[SHA1_DIGEST_LENGTH];
+	char id[GOT_HASH_DIGEST_MAXLEN];
+	int algo;
 	mode_t mode;
 	size_t namelen;
 	/* Followed by namelen bytes of entry's name, not NUL-terminated. */
blob - a17fad35a4e3a657892518b204167bccb6b24289
file + lib/object_open_privsep.c
--- lib/object_open_privsep.c
+++ lib/object_open_privsep.c
@@ -42,6 +42,7 @@
 
 #include "got_lib_delta.h"
 #include "got_lib_object.h"
+#include "got_lib_hash.h"
 #include "got_lib_privsep.h"
 #include "got_lib_object_cache.h"
 #include "got_lib_pack.h"
blob - 0aafbffd522a53c07caf5219f5e6e6133d39d5eb
file + lib/object_parse.c
--- lib/object_parse.c
+++ lib/object_parse.c
@@ -764,7 +764,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, size_t idlen)
+    char *buf, size_t maxlen, size_t idlen, enum got_hash_algorithm algo)
 {
 	char *p, *space;
 
@@ -795,6 +795,8 @@ got_object_parse_tree_entry(struct got_parsed_tree_ent
 	pte->namelen = strlen(pte->name);
 	buf += *elen;
 	pte->id = buf;
+	pte->idlen = idlen;
+	pte->algo = algo;
 	*elen += idlen;
 	return NULL;
 }
@@ -840,7 +842,7 @@ got_object_parse_tree(struct got_parsed_tree_entry **e
 
 		pte = &(*entries)[*nentries];
 		err = got_object_parse_tree_entry(pte, &elen, buf, remain,
-			digest_len);
+		    digest_len, algo);
 		if (err)
 			goto done;
 		buf += elen;
blob - 21a33372de3f7d23116d9edeec23858bec4f935d
file + lib/pack_create_privsep.c
--- lib/pack_create_privsep.c
+++ lib/pack_create_privsep.c
@@ -40,6 +40,7 @@
 #include "got_path.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_object_cache.h"
 #include "got_lib_object_idset.h"
blob - f4f6c729dd161c635672dc12af8bdf34b2c7721e
file + lib/patch.c
--- lib/patch.c
+++ lib/patch.c
@@ -51,9 +51,9 @@
 
 #include "got_lib_delta.h"
 #include "got_lib_diff.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 
 #ifndef MIN
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
blob - 9fc1dd22c6d4e2c1868cd493424a0d5b4fe5ed5a
file + lib/privsep.c
--- lib/privsep.c
+++ lib/privsep.c
@@ -1452,11 +1452,17 @@ send_tree_entries_batch(struct imsgbuf *ibuf,
 		return got_error_from_errno("imsg_add TREE_ENTRY");
 
 	for (i = idx0; i <= idxN; i++) {
+		static const char gap[12]; /* for sha1 inside sha256 align */
 		struct got_parsed_tree_entry *pte = &entries[i];
 
 		/* Keep in sync with struct got_imsg_tree_entry definition! */
-		if (imsg_add(wbuf, pte->id, SHA1_DIGEST_LENGTH) == -1)
+		if (imsg_add(wbuf, pte->id, pte->idlen) == -1)
 			return got_error_from_errno("imsg_add TREE_ENTRY");
+		if (pte->algo == GOT_HASH_SHA1 &&
+		    imsg_add(wbuf, gap, sizeof(gap)) == -1)
+			return got_error_from_errno("imsg_add TREE_ENTRY");
+		if (imsg_add(wbuf, &pte->algo, sizeof(pte->algo)) == -1)
+			return got_error_from_errno("imsg_add TREE_ENTRY");
 		if (imsg_add(wbuf, &pte->mode, sizeof(pte->mode)) == -1)
 			return got_error_from_errno("imsg_add TREE_ENTRY");
 		if (imsg_add(wbuf, &pte->namelen, sizeof(pte->namelen)) == -1)
@@ -1579,7 +1585,7 @@ recv_tree_entries(void *data, size_t datalen, struct g
 		te_name = buf + sizeof(ite);
 		memcpy(te->name, te_name, ite.namelen);
 		te->name[ite.namelen] = '\0';
-		memcpy(te->id.sha1, ite.id, SHA1_DIGEST_LENGTH);
+		memcpy(te->id.sha1, ite.id, sizeof(te->id.sha1));
 		te->mode = ite.mode;
 		te->idx = *nentries;
 		(*nentries)++;
blob - 6f95c0f3be48676947b73e0f94d3c4cb8f97d06e
file + lib/read_gitconfig_privsep.c
--- lib/read_gitconfig_privsep.c
+++ lib/read_gitconfig_privsep.c
@@ -38,6 +38,7 @@
 #include "got_path.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_object_cache.h"
 #include "got_lib_privsep.h"
blob - 05502a62412786df6c1eb1c76b4411c0072d3054
file + lib/read_gotconfig_privsep.c
--- lib/read_gotconfig_privsep.c
+++ lib/read_gotconfig_privsep.c
@@ -35,6 +35,7 @@
 #include "got_repository.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_privsep.h"
 #include "got_lib_gotconfig.h"
blob - 37bc0f5633b6a62f7d4a4d4b044b9301b502b0bd
file + lib/repository.c
--- lib/repository.c
+++ lib/repository.c
@@ -55,13 +55,13 @@
 
 #include "got_lib_delta.h"
 #include "got_lib_delta_cache.h"
+#include "got_lib_hash.h"
 #include "got_lib_inflate.h"
 #include "got_lib_object.h"
 #include "got_lib_object_parse.h"
 #include "got_lib_object_create.h"
 #include "got_lib_pack.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 #include "got_lib_object_cache.h"
 #include "got_lib_repository.h"
 #include "got_lib_gotconfig.h"
blob - 3e6484604a0fd85e52307e35003a601798197c14
file + lib/repository_admin.c
--- lib/repository_admin.c
+++ lib/repository_admin.c
@@ -46,6 +46,7 @@
 #include "got_path.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_object_idset.h"
 #include "got_lib_object_cache.h"
@@ -54,7 +55,6 @@
 #include "got_lib_repository.h"
 #include "got_lib_ratelimit.h"
 #include "got_lib_pack_create.h"
-#include "got_lib_hash.h"
 #include "got_lib_lockfile.h"
 
 #ifndef nitems
blob - 7f75afa1f1f24fe910ee48fc4058be6cef03a8ee
file + libexec/got-read-commit/got-read-commit.c
--- libexec/got-read-commit/got-read-commit.c
+++ libexec/got-read-commit/got-read-commit.c
@@ -35,12 +35,12 @@
 #include "got_object.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_inflate.h"
 #include "got_lib_object.h"
 #include "got_lib_object_parse.h"
 #include "got_lib_object_qid.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 
 static volatile sig_atomic_t sigint_received;
 
blob - 9a5bac7eae6301e9090148ee2ec8d0dbdaf69237
file + libexec/got-read-gitconfig/got-read-gitconfig.c
--- libexec/got-read-gitconfig/got-read-gitconfig.c
+++ libexec/got-read-gitconfig/got-read-gitconfig.c
@@ -36,6 +36,7 @@
 #include "got_repository.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_privsep.h"
 #include "got_lib_gitconfig.h"
blob - 43d3bfb7594fb0bc0bbe2d802c057ea1f4ec4a5e
file + libexec/got-read-gotconfig/got-read-gotconfig.c
--- libexec/got-read-gotconfig/got-read-gotconfig.c
+++ libexec/got-read-gotconfig/got-read-gotconfig.c
@@ -37,6 +37,7 @@
 #include "got_repository.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_privsep.h"
 
blob - 0270712db89ff118f330ae2524053b281b8d46e2
file + libexec/got-read-object/got-read-object.c
--- libexec/got-read-object/got-read-object.c
+++ libexec/got-read-object/got-read-object.c
@@ -35,11 +35,11 @@
 #include "got_object.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_inflate.h"
 #include "got_lib_object.h"
 #include "got_lib_object_parse.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 
 #ifndef nitems
 #define nitems(_a) (sizeof(_a) / sizeof((_a)[0]))
blob - 460b92c34a33a3c21a304ba83a835391f3b6db31
file + libexec/got-read-pack/got-read-pack.c
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
@@ -495,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, idlen);
+			    next_entry1, remain1, idlen, pack->algo);
 			if (err)
 				return err;
 			next_entry1 += elen;
@@ -519,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, idlen);
+			    next_entry2, remain2, idlen, pack->algo);
 			if (err)
 				return err;
 			next_entry2 += elen;
blob - 83d8af428815b7ef730a8ddf19a89a8505a9bd60
file + libexec/got-read-patch/got-read-patch.c
--- libexec/got-read-patch/got-read-patch.c
+++ libexec/got-read-patch/got-read-patch.c
@@ -55,9 +55,9 @@
 #include "got_object.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_object.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 
 struct imsgbuf ibuf;
 
blob - 39ff4fdaae7bf2fd23444ef6aae255310a4f2ad1
file + libexec/got-read-tag/got-read-tag.c
--- libexec/got-read-tag/got-read-tag.c
+++ libexec/got-read-tag/got-read-tag.c
@@ -35,11 +35,11 @@
 #include "got_object.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_inflate.h"
 #include "got_lib_object.h"
 #include "got_lib_object_parse.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 
 static volatile sig_atomic_t sigint_received;
 
blob - 500f786f501a74944230154788890612bf220f7c
file + libexec/got-read-tree/got-read-tree.c
--- libexec/got-read-tree/got-read-tree.c
+++ libexec/got-read-tree/got-read-tree.c
@@ -36,11 +36,11 @@
 #include "got_path.h"
 
 #include "got_lib_delta.h"
+#include "got_lib_hash.h"
 #include "got_lib_inflate.h"
 #include "got_lib_object.h"
 #include "got_lib_object_parse.h"
 #include "got_lib_privsep.h"
-#include "got_lib_hash.h"
 
 static volatile sig_atomic_t sigint_received;