commit - 7a13e6e501f6808283b956b84746cc9e8d2f1b25
commit + 1b484788fec38ce9936267c176e77f653d749b8d
blob - e4665492a3022c605cf1a1fa244f10c606b8b0b7
blob + 69e5ee6dd5a6df3bf8e940c5cf259a8fea557966
--- got/got.c
+++ got/got.c
struct got_blob_object *blob = NULL;
char *commit_id_str = NULL;
struct blame_cb_args bca;
- int ch, obj_type, i, fd = -1;
+ int ch, obj_type, i, fd = -1, fd1 = -1;
off_t filesize;
int *pack_fds = NULL;
}
bca.repo = repo;
+ fd1 = got_opentempfd();
+ if (fd1 == -1) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
error = got_blame(link_target ? link_target : in_repo_path, commit_id,
- repo, blame_cb, &bca, check_cancelled, NULL);
+ repo, blame_cb, &bca, check_cancelled, NULL, fd1);
done:
free(in_repo_path);
free(link_target);
got_object_commit_close(commit);
if (fd != -1 && close(fd) == -1 && error == NULL)
error = got_error_from_errno("close");
+ if (fd1 != -1 && close(fd1) == -1 && error == NULL)
+ error = got_error_from_errno("close");
if (blob)
got_object_blob_close(blob);
if (worktree)
blob - ffc24fe2d445b82dd5d5ff2616a3ce538f584cb8
blob + bfc88e3dd1798a85fee5a3c83f0c80d976b6a896
--- gotweb/gotweb.c
+++ gotweb/gotweb.c
struct got_blob_object *blob = NULL;
char *path = NULL, *in_repo_path = NULL;
struct gw_blame_cb_args bca;
- int i, obj_type, fd = -1;
+ int i, obj_type, fd = -1, fd1 = -1;
off_t filesize;
fd = got_opentempfd();
bca.repo = gw_trans->repo;
bca.gw_trans = gw_trans;
+ fd1 = got_opentempfd();
+ if (fd1 == -1) {
+ error = got_error_from_errno("got_opentempfd");
+ goto done;
+ }
+
error = got_blame(in_repo_path, commit_id, gw_trans->repo, gw_blame_cb,
- &bca, NULL, NULL);
+ &bca, NULL, NULL, fd1);
done:
free(in_repo_path);
free(commit_id);
if (fd != -1 && close(fd) == -1 && error == NULL)
error = got_error_from_errno("close");
+ if (fd1 != -1 && close(fd1) == -1 && error == NULL)
+ error = got_error_from_errno("close");
+
if (blob) {
free(bca.line_offsets);
for (i = 0; i < bca.nlines; i++) {
blob - e360955ca287d181a8ff24dbf66100470e96de18
blob + 56e2d804dc17e77e5b5660bcd248453a942fcbb4
--- include/got_blame.h
+++ include/got_blame.h
*/
const struct got_error *got_blame(const char *,
struct got_object_id *, struct got_repository *,
- got_blame_cb, void *, got_cancel_cb, void *);
+ got_blame_cb, void *, got_cancel_cb, void *, int);
blob - ccdc439eeee3aee6cb11526d0cd547f98bb7612c
blob + 68e7392e8e977dcd4362e7961374a990f1dba55c
--- lib/blame.c
+++ lib/blame.c
static const struct got_error *
blame_open(struct got_blame **blamep, const char *path,
struct got_object_id *start_commit_id, struct got_repository *repo,
- got_blame_cb cb, void *arg, got_cancel_cb cancel_cb, void *cancel_arg)
+ got_blame_cb cb, void *arg, got_cancel_cb cancel_cb, void *cancel_arg,
+ int fd)
{
const struct got_error *err = NULL;
struct got_commit_object *start_commit = NULL, *last_commit = NULL;
struct got_blob_object *blob = NULL;
struct got_blame *blame = NULL;
struct got_object_id *id = NULL;
- int lineno, fd = -1;
+ int lineno;
struct got_commit_graph *graph = NULL;
- fd = got_opentempfd();
- if (fd == -1)
- return got_error_from_errno("got_opentempfd");
-
*blamep = NULL;
err = got_object_open_as_commit(&start_commit, repo, start_commit_id);
if (graph)
got_commit_graph_close(graph);
free(obj_id);
- if (fd != -1 && close(fd) == -1 && err == NULL)
- err = got_error_from_errno("close");
if (blob)
got_object_blob_close(blob);
if (start_commit)
const struct got_error *
got_blame(const char *path, struct got_object_id *commit_id,
struct got_repository *repo, got_blame_cb cb, void *arg,
- got_cancel_cb cancel_cb, void* cancel_arg)
+ got_cancel_cb cancel_cb, void* cancel_arg, int fd)
{
const struct got_error *err = NULL, *close_err = NULL;
struct got_blame *blame;
return got_error_from_errno2("asprintf", path);
err = blame_open(&blame, abspath, commit_id, repo, cb, arg,
- cancel_cb, cancel_arg);
+ cancel_cb, cancel_arg, fd);
free(abspath);
if (blame)
close_err = blame_close(blame);
blob - 02357b5d2aa6509aa4c4c341f9bc46ba93cf213d
blob + 0b32bf9f96120b686083e5da9c0c904bb272a486
--- tog/tog.c
+++ tog/tog.c
const struct got_error *err, *close_err;
struct tog_blame_thread_args *ta = arg;
struct tog_blame_cb_args *a = ta->cb_args;
- int errcode;
+ int errcode, fd = -1;
+
+ fd = got_opentempfd();
+ if (fd == -1)
+ return (void *)got_error_from_errno("got_opentempfd");
err = block_signals_used_by_main_thread();
if (err)
return (void *)err;
err = got_blame(ta->path, a->commit_id, ta->repo,
- blame_cb, ta->cb_args, ta->cancel_cb, ta->cancel_arg);
+ blame_cb, ta->cb_args, ta->cancel_cb, ta->cancel_arg, fd);
if (err && err->code == GOT_ERR_CANCELLED)
err = NULL;
if (errcode && err == NULL)
err = got_error_set_errno(errcode, "pthread_mutex_unlock");
+ if (fd != -1 && close(fd) == -1 && err == NULL)
+ err = got_error_from_errno("close");
+
return (void *)err;
}