commit - 6e72e6a3bf1fd0e9a976114e25c7aad6b22587b0
commit + a158c90155bc8066c8f6d87a4a9600d8c5bf54c8
blob - 5c3980f2f01b211568497aa87e29167f3de13b4d
blob + ae71532fe7a380d04f28a2e6f704da5b1fd449f9
--- lib/got_lib_object_parse.h
+++ lib/got_lib_object_parse.h
struct got_pack;
struct got_packidx;
-const struct got_error *got_object_packed_read_privsep(struct got_object **,
- struct got_repository *, struct got_pack *, struct got_packidx *, int,
- struct got_object_id *);
-const struct got_error *
-got_object_read_packed_commit_privsep(struct got_commit_object **,
- struct got_pack *, struct got_packidx *, int, struct got_object_id *);
-const struct got_error *got_object_read_packed_tree_privsep(
- struct got_tree_object **, struct got_object *, struct got_pack *);
-const struct got_error *got_object_read_packed_tag_privsep(
- struct got_tag_object **, struct got_object *, struct got_pack *);
const struct got_error *got_object_parse_header(struct got_object **, char *, size_t);
const struct got_error *got_object_read_header(struct got_object **, int);
blob - 0406a8a5ff30b2df72569dbf3eeddbc5c3ae1bd4
blob + d47d917051346eabe1c76e22aeb6b7d3fd73d3c2
--- lib/object.c
+++ lib/object.c
return NULL;
}
+static void
+exec_privsep_child(int imsg_fds[2], const char *path, const char *repo_path)
+{
+ close(imsg_fds[0]);
+
+ if (dup2(imsg_fds[1], GOT_IMSG_FD_CHILD) == -1) {
+ fprintf(stderr, "%s: %s\n", getprogname(),
+ strerror(errno));
+ _exit(1);
+ }
+ if (closefrom(GOT_IMSG_FD_CHILD + 1) == -1) {
+ fprintf(stderr, "%s: %s\n", getprogname(),
+ strerror(errno));
+ _exit(1);
+ }
+
+ if (execl(path, path, repo_path, (char *)NULL) == -1) {
+ fprintf(stderr, "%s: %s: %s\n", getprogname(), path,
+ strerror(errno));
+ _exit(1);
+ }
+}
+
static const struct got_error *
+request_packed_object(struct got_object **obj, struct got_pack *pack, int idx,
+ struct got_object_id *id)
+{
+ const struct got_error *err = NULL;
+ struct imsgbuf *ibuf = pack->privsep_child->ibuf;
+
+ err = got_privsep_send_packed_obj_req(ibuf, idx, id);
+ if (err)
+ return err;
+
+ err = got_privsep_recv_obj(obj, ibuf);
+ if (err)
+ return err;
+
+ (*obj)->path_packfile = strdup(pack->path_packfile);
+ if ((*obj)->path_packfile == NULL) {
+ err = got_error_from_errno();
+ return err;
+ }
+ memcpy(&(*obj)->id, id, sizeof((*obj)->id));
+
+ return NULL;
+}
+
+static const struct got_error *
+read_packed_object_privsep(struct got_object **obj,
+ struct got_repository *repo, struct got_pack *pack,
+ struct got_packidx *packidx, int idx, struct got_object_id *id)
+{
+ const struct got_error *err = NULL;
+ int imsg_fds[2];
+ pid_t pid;
+ struct imsgbuf *ibuf;
+
+ if (pack->privsep_child)
+ return request_packed_object(obj, pack, idx, id);
+
+ ibuf = calloc(1, sizeof(*ibuf));
+ if (ibuf == NULL)
+ return got_error_from_errno();
+
+ pack->privsep_child = calloc(1, sizeof(*pack->privsep_child));
+ if (pack->privsep_child == NULL) {
+ err = got_error_from_errno();
+ free(ibuf);
+ return err;
+ }
+
+ if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, imsg_fds) == -1) {
+ err = got_error_from_errno();
+ goto done;
+ }
+
+ pid = fork();
+ if (pid == -1) {
+ err = got_error_from_errno();
+ goto done;
+ } else if (pid == 0) {
+ exec_privsep_child(imsg_fds, GOT_PATH_PROG_READ_PACK,
+ pack->path_packfile);
+ /* not reached */
+ }
+
+ close(imsg_fds[1]);
+ pack->privsep_child->imsg_fd = imsg_fds[0];
+ pack->privsep_child->pid = pid;
+ imsg_init(ibuf, imsg_fds[0]);
+ pack->privsep_child->ibuf = ibuf;
+
+ err = got_privsep_init_pack_child(ibuf, pack, packidx);
+ if (err) {
+ const struct got_error *child_err;
+ err = got_privsep_send_stop(pack->privsep_child->imsg_fd);
+ child_err = got_privsep_wait_for_child(
+ pack->privsep_child->pid);
+ if (child_err && err == NULL)
+ err = child_err;
+ free(ibuf);
+ free(pack->privsep_child);
+ pack->privsep_child = NULL;
+ return err;
+ }
+
+done:
+ if (err) {
+ free(ibuf);
+ free(pack->privsep_child);
+ pack->privsep_child = NULL;
+ } else
+ err = request_packed_object(obj, pack, idx, id);
+ return err;
+}
+
+
+static const struct got_error *
open_packed_object(struct got_object **obj, struct got_object_id *id,
struct got_repository *repo)
{
goto done;
}
- err = got_object_packed_read_privsep(obj, repo, pack, packidx, idx, id);
+ err = read_packed_object_privsep(obj, repo, pack, packidx, idx, id);
if (err)
goto done;
}
static const struct got_error *
+request_packed_commit(struct got_commit_object **commit, struct got_pack *pack,
+ int pack_idx, struct got_object_id *id)
+{
+ const struct got_error *err = NULL;
+
+ err = got_privsep_send_commit_req(pack->privsep_child->ibuf, -1, id,
+ pack_idx);
+ if (err)
+ return err;
+
+ return got_privsep_recv_commit(commit, pack->privsep_child->ibuf);
+}
+
+static const struct got_error *
+read_packed_commit_privsep(struct got_commit_object **commit,
+ struct got_pack *pack, struct got_packidx *packidx, int idx,
+ struct got_object_id *id)
+{
+ const struct got_error *err = NULL;
+ int imsg_fds[2];
+ pid_t pid;
+ struct imsgbuf *ibuf;
+
+ if (pack->privsep_child)
+ return request_packed_commit(commit, pack, idx, id);
+
+ ibuf = calloc(1, sizeof(*ibuf));
+ if (ibuf == NULL)
+ return got_error_from_errno();
+
+ pack->privsep_child = calloc(1, sizeof(*pack->privsep_child));
+ if (pack->privsep_child == NULL) {
+ err = got_error_from_errno();
+ free(ibuf);
+ return err;
+ }
+
+ if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, imsg_fds) == -1) {
+ err = got_error_from_errno();
+ goto done;
+ }
+
+ pid = fork();
+ if (pid == -1) {
+ err = got_error_from_errno();
+ goto done;
+ } else if (pid == 0) {
+ exec_privsep_child(imsg_fds, GOT_PATH_PROG_READ_PACK,
+ pack->path_packfile);
+ /* not reached */
+ }
+
+ close(imsg_fds[1]);
+ pack->privsep_child->imsg_fd = imsg_fds[0];
+ pack->privsep_child->pid = pid;
+ imsg_init(ibuf, imsg_fds[0]);
+ pack->privsep_child->ibuf = ibuf;
+
+ err = got_privsep_init_pack_child(ibuf, pack, packidx);
+ if (err) {
+ const struct got_error *child_err;
+ err = got_privsep_send_stop(pack->privsep_child->imsg_fd);
+ child_err = got_privsep_wait_for_child(
+ pack->privsep_child->pid);
+ if (child_err && err == NULL)
+ err = child_err;
+ free(ibuf);
+ free(pack->privsep_child);
+ pack->privsep_child = NULL;
+ return err;
+ }
+
+done:
+ if (err) {
+ free(ibuf);
+ free(pack->privsep_child);
+ pack->privsep_child = NULL;
+ } else
+ err = request_packed_commit(commit, pack, idx, id);
+ return err;
+}
+
+
+static const struct got_error *
open_commit(struct got_commit_object **commit,
struct got_repository *repo, struct got_object_id *id, int check_cache)
{
if (err)
return err;
}
- err = got_object_read_packed_commit_privsep(commit, pack,
+ err = read_packed_commit_privsep(commit, pack,
packidx, idx, id);
} else if (err->code == GOT_ERR_NO_OBJ) {
int fd;
}
return NULL;
+}
+
+static const struct got_error *
+read_packed_tree_privsep(struct got_tree_object **tree,
+ struct got_object *obj, struct got_pack *pack)
+{
+ const struct got_error *err = NULL;
+
+ err = got_privsep_send_obj_req(pack->privsep_child->ibuf, -1, obj);
+ if (err)
+ return err;
+
+ return got_privsep_recv_tree(tree, pack->privsep_child->ibuf);
}
static const struct got_error *
if (err)
return err;
}
- err = got_object_read_packed_tree_privsep(tree, obj, pack);
+ err = read_packed_tree_privsep(tree, obj, pack);
} else {
int fd;
err = open_loose_object(&fd, got_object_get_id(obj), repo);
}
static const struct got_error *
+read_packed_tag_privsep(struct got_tag_object **tag,
+ struct got_object *obj, struct got_pack *pack)
+{
+ const struct got_error *err = NULL;
+
+ err = got_privsep_send_obj_req(pack->privsep_child->ibuf, -1, obj);
+ if (err)
+ return err;
+
+ return got_privsep_recv_tag(tag, pack->privsep_child->ibuf);
+}
+
+
+static const struct got_error *
open_tag(struct got_tag_object **tag,
struct got_repository *repo, struct got_object *obj, int check_cache)
{
if (err)
return err;
}
- err = got_object_read_packed_tag_privsep(tag, obj, pack);
+ err = read_packed_tag_privsep(tag, obj, pack);
} else {
int fd;
err = open_loose_object(&fd, got_object_get_id(obj), repo);
if (tree2 && tree2 != tree02)
got_object_tree_close(tree2);
return err;
-}
-
-static void
-exec_privsep_child(int imsg_fds[2], const char *path, const char *repo_path)
-{
- close(imsg_fds[0]);
-
- if (dup2(imsg_fds[1], GOT_IMSG_FD_CHILD) == -1) {
- fprintf(stderr, "%s: %s\n", getprogname(),
- strerror(errno));
- _exit(1);
- }
- if (closefrom(GOT_IMSG_FD_CHILD + 1) == -1) {
- fprintf(stderr, "%s: %s\n", getprogname(),
- strerror(errno));
- _exit(1);
- }
-
- if (execl(path, path, repo_path, (char *)NULL) == -1) {
- fprintf(stderr, "%s: %s: %s\n", getprogname(), path,
- strerror(errno));
- _exit(1);
- }
}
static const struct got_error *
}
static const struct got_error *
-request_packed_object(struct got_object **obj, struct got_pack *pack, int idx,
- struct got_object_id *id)
-{
- const struct got_error *err = NULL;
- struct imsgbuf *ibuf = pack->privsep_child->ibuf;
-
- err = got_privsep_send_packed_obj_req(ibuf, idx, id);
- if (err)
- return err;
-
- err = got_privsep_recv_obj(obj, ibuf);
- if (err)
- return err;
-
- (*obj)->path_packfile = strdup(pack->path_packfile);
- if ((*obj)->path_packfile == NULL) {
- err = got_error_from_errno();
- return err;
- }
- memcpy(&(*obj)->id, id, sizeof((*obj)->id));
-
- return NULL;
-}
-
-const struct got_error *
-got_object_packed_read_privsep(struct got_object **obj,
- struct got_repository *repo, struct got_pack *pack,
- struct got_packidx *packidx, int idx, struct got_object_id *id)
-{
- const struct got_error *err = NULL;
- int imsg_fds[2];
- pid_t pid;
- struct imsgbuf *ibuf;
-
- if (pack->privsep_child)
- return request_packed_object(obj, pack, idx, id);
-
- ibuf = calloc(1, sizeof(*ibuf));
- if (ibuf == NULL)
- return got_error_from_errno();
-
- pack->privsep_child = calloc(1, sizeof(*pack->privsep_child));
- if (pack->privsep_child == NULL) {
- err = got_error_from_errno();
- free(ibuf);
- return err;
- }
-
- if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, imsg_fds) == -1) {
- err = got_error_from_errno();
- goto done;
- }
-
- pid = fork();
- if (pid == -1) {
- err = got_error_from_errno();
- goto done;
- } else if (pid == 0) {
- exec_privsep_child(imsg_fds, GOT_PATH_PROG_READ_PACK,
- pack->path_packfile);
- /* not reached */
- }
-
- close(imsg_fds[1]);
- pack->privsep_child->imsg_fd = imsg_fds[0];
- pack->privsep_child->pid = pid;
- imsg_init(ibuf, imsg_fds[0]);
- pack->privsep_child->ibuf = ibuf;
-
- err = got_privsep_init_pack_child(ibuf, pack, packidx);
- if (err) {
- const struct got_error *child_err;
- err = got_privsep_send_stop(pack->privsep_child->imsg_fd);
- child_err = got_privsep_wait_for_child(
- pack->privsep_child->pid);
- if (child_err && err == NULL)
- err = child_err;
- free(ibuf);
- free(pack->privsep_child);
- pack->privsep_child = NULL;
- return err;
- }
-
-done:
- if (err) {
- free(ibuf);
- free(pack->privsep_child);
- pack->privsep_child = NULL;
- } else
- err = request_packed_object(obj, pack, idx, id);
- return err;
-}
-
-static const struct got_error *
request_commit(struct got_commit_object **commit, struct got_repository *repo,
int fd)
{
return got_privsep_recv_commit(commit, ibuf);
}
-static const struct got_error *
-request_packed_commit(struct got_commit_object **commit, struct got_pack *pack,
- int pack_idx, struct got_object_id *id)
-{
- const struct got_error *err = NULL;
-
- err = got_privsep_send_commit_req(pack->privsep_child->ibuf, -1, id,
- pack_idx);
- if (err)
- return err;
-
- return got_privsep_recv_commit(commit, pack->privsep_child->ibuf);
-}
-
const struct got_error *
-got_object_read_packed_commit_privsep(struct got_commit_object **commit,
- struct got_pack *pack, struct got_packidx *packidx, int idx,
- struct got_object_id *id)
-{
- const struct got_error *err = NULL;
- int imsg_fds[2];
- pid_t pid;
- struct imsgbuf *ibuf;
-
- if (pack->privsep_child)
- return request_packed_commit(commit, pack, idx, id);
-
- ibuf = calloc(1, sizeof(*ibuf));
- if (ibuf == NULL)
- return got_error_from_errno();
-
- pack->privsep_child = calloc(1, sizeof(*pack->privsep_child));
- if (pack->privsep_child == NULL) {
- err = got_error_from_errno();
- free(ibuf);
- return err;
- }
-
- if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, imsg_fds) == -1) {
- err = got_error_from_errno();
- goto done;
- }
-
- pid = fork();
- if (pid == -1) {
- err = got_error_from_errno();
- goto done;
- } else if (pid == 0) {
- exec_privsep_child(imsg_fds, GOT_PATH_PROG_READ_PACK,
- pack->path_packfile);
- /* not reached */
- }
-
- close(imsg_fds[1]);
- pack->privsep_child->imsg_fd = imsg_fds[0];
- pack->privsep_child->pid = pid;
- imsg_init(ibuf, imsg_fds[0]);
- pack->privsep_child->ibuf = ibuf;
-
- err = got_privsep_init_pack_child(ibuf, pack, packidx);
- if (err) {
- const struct got_error *child_err;
- err = got_privsep_send_stop(pack->privsep_child->imsg_fd);
- child_err = got_privsep_wait_for_child(
- pack->privsep_child->pid);
- if (child_err && err == NULL)
- err = child_err;
- free(ibuf);
- free(pack->privsep_child);
- pack->privsep_child = NULL;
- return err;
- }
-
-done:
- if (err) {
- free(ibuf);
- free(pack->privsep_child);
- pack->privsep_child = NULL;
- } else
- err = request_packed_commit(commit, pack, idx, id);
- return err;
-}
-
-const struct got_error *
got_object_read_commit_privsep(struct got_commit_object **commit,
int obj_fd, struct got_repository *repo)
{
return request_tree(tree, repo, obj, obj_fd);
}
-const struct got_error *
-got_object_read_packed_tree_privsep(struct got_tree_object **tree,
- struct got_object *obj, struct got_pack *pack)
-{
- const struct got_error *err = NULL;
-
- err = got_privsep_send_obj_req(pack->privsep_child->ibuf, -1, obj);
- if (err)
- return err;
-
- return got_privsep_recv_tree(tree, pack->privsep_child->ibuf);
-}
-
static const struct got_error *
request_blob(size_t *size, int outfd, int infd, struct imsgbuf *ibuf)
{
}
const struct got_error *
-got_object_read_packed_tag_privsep(struct got_tag_object **tag,
- struct got_object *obj, struct got_pack *pack)
-{
- const struct got_error *err = NULL;
-
- err = got_privsep_send_obj_req(pack->privsep_child->ibuf, -1, obj);
- if (err)
- return err;
-
- return got_privsep_recv_tag(tag, pack->privsep_child->ibuf);
-}
-
-const struct got_error *
got_object_read_tag_privsep(struct got_tag_object **tag,
struct got_object *obj, int obj_fd, struct got_repository *repo)
{