From: Stefan Sperling Subject: Re: use struct got_object_id instead of just the digest To: Omar Polo Cc: gameoftrees@openbsd.org Date: Sun, 19 Feb 2023 18:35:38 +0100 On Sun, Feb 19, 2023 at 02:30:20PM +0100, Omar Polo wrote: > This makes got_imsg_commit_painting_request, got_imsg_tag_object and > GOT_IMSG_TRAVERSED_COMMITS bundle the struct got_object_id. They all > copy the hash digest to the imsg struct and then from it to an object > id, so this change for the moment is a no-op. It'll avoid breakages > when the struct got_object_id will grow (i.e. soon™) > > ok? Yes, ok. This will eventually be using sha2 IDs. > diff /home/op/w/gotd > commit - b685c8da4da0617ce1f98749fbd7014bda6d3fc3 > path + /home/op/w/gotd > blob - 55cb4225a7ff5f243189735fc4e49c4be4d22e7a > file + lib/got_lib_privsep.h > --- lib/got_lib_privsep.h > +++ lib/got_lib_privsep.h > @@ -344,7 +344,7 @@ struct got_imsg_commit_painting_request { > > /* Structure for GOT_IMSG_COMMIT_PAINTING_REQUEST. */ > struct got_imsg_commit_painting_request { > - uint8_t id[SHA1_DIGEST_LENGTH]; > + struct got_object_id id; > int idx; > int color; > } __attribute__((__packed__)); > @@ -365,7 +365,7 @@ struct got_imsg_tag_object { > > /* Structure for GOT_IMSG_TAG data. */ > struct got_imsg_tag_object { > - uint8_t id[SHA1_DIGEST_LENGTH]; > + struct got_object_id id; > int obj_type; > size_t tag_len; > size_t tagger_len; > @@ -585,7 +585,7 @@ struct got_imsg_traversed_commits { > /* Structure for GOT_IMSG_TRAVERSED_COMMITS */ > struct got_imsg_traversed_commits { > size_t ncommits; > - /* Followed by ncommit IDs of SHA1_DIGEST_LENGTH each */ > + /* Followed by ncommit struct got_object_id */ > } __attribute__((__packed__)); > > /* Structure for GOT_IMSG_ENUMERATED_COMMIT */ > blob - a60e0339f8024823ed0d7e275d26f839dbbdb717 > file + lib/privsep.c > --- lib/privsep.c > +++ lib/privsep.c > @@ -1793,7 +1793,7 @@ got_privsep_send_tag(struct imsgbuf *ibuf, struct got_ > return got_error_from_errno("malloc"); > > itag = (struct got_imsg_tag_object *)buf; > - memcpy(itag->id, tag->id.sha1, sizeof(itag->id)); > + memcpy(&itag->id, &tag->id, sizeof(itag->id)); > itag->obj_type = tag->obj_type; > itag->tag_len = tag_len; > itag->tagger_len = tagger_len; > @@ -1864,7 +1864,7 @@ got_privsep_recv_tag(struct got_tag_object **tag, stru > break; > } > > - memcpy((*tag)->id.sha1, itag->id, SHA1_DIGEST_LENGTH); > + memcpy(&(*tag)->id, &itag->id, sizeof(itag->id)); > > (*tag)->tag = strndup(imsg.data + len, itag->tag_len); > if ((*tag)->tag == NULL) { > @@ -2680,6 +2680,7 @@ got_privsep_recv_traversed_commits(struct got_commit_o > const struct got_error *err = NULL; > struct imsg imsg; > struct got_imsg_traversed_commits *icommits; > + struct got_object_id *ids; > size_t datalen; > int i, done = 0; > > @@ -2696,18 +2697,18 @@ got_privsep_recv_traversed_commits(struct got_commit_o > case GOT_IMSG_TRAVERSED_COMMITS: > icommits = imsg.data; > if (datalen != sizeof(*icommits) + > - icommits->ncommits * SHA1_DIGEST_LENGTH) { > + icommits->ncommits * sizeof(*ids)) { > err = got_error(GOT_ERR_PRIVSEP_LEN); > break; > } > + ids = imsg.data + sizeof(*icommits); > for (i = 0; i < icommits->ncommits; i++) { > struct got_object_qid *qid; > - uint8_t *sha1 = (uint8_t *)imsg.data + > - sizeof(*icommits) + i * SHA1_DIGEST_LENGTH; > + > err = got_object_qid_alloc_partial(&qid); > if (err) > break; > - memcpy(qid->id.sha1, sha1, SHA1_DIGEST_LENGTH); > + memcpy(&qid->id, &ids[i], sizeof(ids[i])); > STAILQ_INSERT_TAIL(commit_ids, qid, entry); > > /* The last commit may contain a change. */ > @@ -3381,7 +3382,7 @@ got_privsep_send_painting_request(struct imsgbuf *ibuf > struct got_imsg_commit_painting_request ireq; > > memset(&ireq, 0, sizeof(ireq)); > - memcpy(ireq.id, id->sha1, sizeof(ireq.id)); > + memcpy(&ireq.id, id, sizeof(ireq.id)); > ireq.idx = idx; > ireq.color = color; > > blob - 1cb98bf68ab578890b9806b248b38305052b2068 > 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 > @@ -564,7 +564,7 @@ send_traversed_commits(struct got_object_id *commit_id > > wbuf = imsg_create(ibuf, GOT_IMSG_TRAVERSED_COMMITS, 0, 0, > sizeof(struct got_imsg_traversed_commits) + > - ncommits * SHA1_DIGEST_LENGTH); > + ncommits * sizeof(commit_ids[0])); > if (wbuf == NULL) > return got_error_from_errno("imsg_create TRAVERSED_COMMITS"); > > @@ -573,7 +573,7 @@ send_traversed_commits(struct got_object_id *commit_id > > for (i = 0; i < ncommits; i++) { > struct got_object_id *id = &commit_ids[i]; > - if (imsg_add(wbuf, id->sha1, SHA1_DIGEST_LENGTH) == -1) { > + if (imsg_add(wbuf, id, sizeof(*id)) == -1) { > return got_error_from_errno( > "imsg_add TRAVERSED_COMMITS"); > } > @@ -658,7 +658,7 @@ commit_traversal_request(struct imsg *imsg, struct ims > } > > if (sizeof(struct got_imsg_traversed_commits) + > - ncommits * SHA1_DIGEST_LENGTH >= max_datalen) { > + ncommits * sizeof(commit_ids[0]) >= max_datalen) { > err = send_traversed_commits(commit_ids, ncommits, > ibuf); > if (err) > @@ -1193,7 +1193,7 @@ enumerate_tree(int *have_all_entries, struct imsgbuf * > err = got_object_qid_alloc_partial(&qid); > if (err) > return err; > - memcpy(&qid->id.sha1, tree_id, SHA1_DIGEST_LENGTH); > + memcpy(&qid->id, tree_id, sizeof(*tree_id)); > qid->data = strdup(path); > if (qid->data == NULL) { > err = got_error_from_errno("strdup"); > @@ -1797,7 +1797,7 @@ commit_painting_request(struct imsg *imsg, struct imsg > if (datalen != sizeof(ireq)) > return got_error(GOT_ERR_PRIVSEP_LEN); > memcpy(&ireq, imsg->data, sizeof(ireq)); > - memcpy(id.sha1, ireq.id, SHA1_DIGEST_LENGTH); > + memcpy(&id, &ireq.id, sizeof(id)); > > err = queue_commit_id(&ids, &id, ireq.color); > if (err) > >