projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'jk/git-connection-deadlock-fix'
[git.git]
/
connect.c
diff --git
a/connect.c
b/connect.c
index 57dc20c43ca1ba205ec0a18e263f9dde081390f4..2119c3f74edcd2a976ff0e375c5d8d60d40da2ec 100644
(file)
--- a/
connect.c
+++ b/
connect.c
@@
-395,26
+395,28
@@
static int git_use_proxy(const char *host)
return (git_proxy_command && *git_proxy_command);
}
return (git_proxy_command && *git_proxy_command);
}
-static
void
git_proxy_connect(int fd[2], char *host)
+static
struct child_process *
git_proxy_connect(int fd[2], char *host)
{
const char *port = STR(DEFAULT_GIT_PORT);
{
const char *port = STR(DEFAULT_GIT_PORT);
- const char *
argv[4]
;
- struct child_process proxy;
+ const char *
*argv
;
+ struct child_process
*
proxy;
get_host_and_port(&host, &port);
get_host_and_port(&host, &port);
+ argv = xmalloc(sizeof(*argv) * 4);
argv[0] = git_proxy_command;
argv[1] = host;
argv[2] = port;
argv[3] = NULL;
argv[0] = git_proxy_command;
argv[1] = host;
argv[2] = port;
argv[3] = NULL;
-
memset(&proxy, 0, sizeof(
proxy));
- proxy
.
argv = argv;
- proxy
.
in = -1;
- proxy
.
out = -1;
- if (start_command(
&
proxy))
+
proxy = xcalloc(1, sizeof(*
proxy));
+ proxy
->
argv = argv;
+ proxy
->
in = -1;
+ proxy
->
out = -1;
+ if (start_command(proxy))
die("cannot start proxy %s", argv[0]);
die("cannot start proxy %s", argv[0]);
- fd[0] = proxy.out; /* read from proxy stdout */
- fd[1] = proxy.in; /* write to proxy stdin */
+ fd[0] = proxy->out; /* read from proxy stdout */
+ fd[1] = proxy->in; /* write to proxy stdin */
+ return proxy;
}
#define MAX_CMD_LEN 1024
}
#define MAX_CMD_LEN 1024
@@
-455,7
+457,7
@@
struct child_process *git_connect(int fd[2], const char *url_orig,
char *host, *path;
char *end;
int c;
char *host, *path;
char *end;
int c;
- struct child_process *conn;
+ struct child_process *conn
= &no_fork
;
enum protocol protocol = PROTO_LOCAL;
int free_path = 0;
char *port = NULL;
enum protocol protocol = PROTO_LOCAL;
int free_path = 0;
char *port = NULL;
@@
-540,7
+542,7
@@
struct child_process *git_connect(int fd[2], const char *url_orig,
*/
char *target_host = xstrdup(host);
if (git_use_proxy(host))
*/
char *target_host = xstrdup(host);
if (git_use_proxy(host))
- git_proxy_connect(fd, host);
+
conn =
git_proxy_connect(fd, host);
else
git_tcp_connect(fd, host, flags);
/*
else
git_tcp_connect(fd, host, flags);
/*
@@
-558,7
+560,7
@@
struct child_process *git_connect(int fd[2], const char *url_orig,
free(url);
if (free_path)
free(path);
free(url);
if (free_path)
free(path);
- return
&no_fork
;
+ return
conn
;
}
conn = xcalloc(1, sizeof(*conn));
}
conn = xcalloc(1, sizeof(*conn));
@@
-607,10
+609,15
@@
struct child_process *git_connect(int fd[2], const char *url_orig,
return conn;
}
return conn;
}
+int git_connection_is_socket(struct child_process *conn)
+{
+ return conn == &no_fork;
+}
+
int finish_connect(struct child_process *conn)
{
int code;
int finish_connect(struct child_process *conn)
{
int code;
- if (!conn ||
conn == &no_fork
)
+ if (!conn ||
git_connection_is_socket(conn)
)
return 0;
code = finish_command(conn);
return 0;
code = finish_command(conn);