Skip to content

Commit

Permalink
cleanups: Fix potential bugs in connect.c
Browse files Browse the repository at this point in the history
The strncmp for ACK was ACK does not include the final space.
Presumably either we should either remove the trailing space,
or compare 4 chars (as this patch does).

'path' is sometimes strdup'ed, but never freed.

Signed-off-by: Serge E. Hallyn <serue@us.ibm.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Serge E. Hallyn authored and Junio C Hamano committed Apr 17, 2006
1 parent 6feba7c commit da2a95b
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions connect.c
Expand Up @@ -74,7 +74,7 @@ int get_ack(int fd, unsigned char *result_sha1)
line[--len] = 0;
if (!strcmp(line, "NAK"))
return 0;
if (!strncmp(line, "ACK ", 3)) {
if (!strncmp(line, "ACK ", 4)) {
if (!get_sha1_hex(line+4, result_sha1)) {
if (strstr(line+45, "continue"))
return 2;
Expand Down Expand Up @@ -567,6 +567,7 @@ int git_connect(int fd[2], char *url, const char *prog)
int pipefd[2][2];
pid_t pid;
enum protocol protocol = PROTO_LOCAL;
int free_path = 0;

host = strstr(url, "://");
if(host) {
Expand Down Expand Up @@ -610,16 +611,23 @@ int git_connect(int fd[2], char *url, const char *prog)
char *ptr = path;
if (path[1] == '~')
path++;
else
else {
path = strdup(ptr);
free_path = 1;
}

*ptr = '\0';
}

if (protocol == PROTO_GIT) {
int ret;
if (git_use_proxy(host))
return git_proxy_connect(fd, prog, host, path);
return git_tcp_connect(fd, prog, host, path);
ret = git_proxy_connect(fd, prog, host, path);
else
ret = git_tcp_connect(fd, prog, host, path);
if (free_path)
free(path);
return ret;
}

if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0)
Expand Down Expand Up @@ -659,6 +667,8 @@ int git_connect(int fd[2], char *url, const char *prog)
fd[1] = pipefd[1][1];
close(pipefd[0][1]);
close(pipefd[1][0]);
if (free_path)
free(path);
return pid;
}

Expand Down

0 comments on commit da2a95b

Please sign in to comment.