commit a158c90155bc8066c8f6d87a4a9600d8c5bf54c8 from: Stefan Sperling date: Sun Dec 23 22:35:37 2018 UTC make all the _packed_read_privsep() functions local to object.c commit - 6e72e6a3bf1fd0e9a976114e25c7aad6b22587b0 commit + a158c90155bc8066c8f6d87a4a9600d8c5bf54c8 blob - 5c3980f2f01b211568497aa87e29167f3de13b4d blob + ae71532fe7a380d04f28a2e6f704da5b1fd449f9 --- lib/got_lib_object_parse.h +++ lib/got_lib_object_parse.h @@ -41,15 +41,5 @@ void got_object_tree_entry_close(struct got_tree_entry 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 @@ -178,7 +178,125 @@ get_packfile_path(char **path_packfile, struct got_pac 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) { @@ -203,7 +321,7 @@ open_packed_object(struct got_object **obj, struct got 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; @@ -295,6 +413,90 @@ got_object_resolve_id_str(struct got_object_id **id, } 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) { @@ -327,7 +529,7 @@ open_commit(struct got_commit_object **commit, 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; @@ -385,6 +587,19 @@ got_object_qid_alloc(struct got_object_qid **qid, stru } 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 * @@ -414,7 +629,7 @@ open_tree(struct got_tree_object **tree, 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); @@ -726,6 +941,20 @@ got_object_blob_dump_to_file(size_t *total_len, int *n } 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) { @@ -752,7 +981,7 @@ open_tag(struct got_tag_object **tag, 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); @@ -999,29 +1228,6 @@ done: 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 * @@ -1077,100 +1283,6 @@ got_object_read_header_privsep(struct got_object **obj } 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) { @@ -1186,90 +1298,7 @@ request_commit(struct got_commit_object **commit, stru 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) { @@ -1361,19 +1390,6 @@ got_object_read_tree_privsep(struct got_tree_object ** 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) { @@ -1460,19 +1476,6 @@ request_tag(struct got_tag_object **tag, struct got_re } 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) {