connect: improve check for plink to reduce false positives
The git_connect function has code to handle plink and tortoiseplink specially, as they require different command line arguments from OpenSSH (-P instead of -p for ports; tortoiseplink additionally requires -batch). However, the match was done by checking for "plink" anywhere in the string, which led to a GIT_SSH value containing "uplink" being treated as an invocation of putty's plink. Improve the check by looking for "plink" or "tortoiseplink" (or those names suffixed with ".exe") only in the final component of the path. This has the downside that a program such as "plink-0.63" would no longer be recognized, but the increased robustness is likely worth it. Add tests to cover these cases to avoid regressions. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
d1018c2494
commit
baaf233755
18
connect.c
18
connect.c
@ -722,7 +722,7 @@ struct child_process *git_connect(int fd[2], const char *url,
|
||||
conn->in = conn->out = -1;
|
||||
if (protocol == PROTO_SSH) {
|
||||
const char *ssh;
|
||||
int putty;
|
||||
int putty, tortoiseplink = 0;
|
||||
char *ssh_host = hostandport;
|
||||
const char *port = NULL;
|
||||
get_host_and_port(&ssh_host, &port);
|
||||
@ -747,14 +747,26 @@ struct child_process *git_connect(int fd[2], const char *url,
|
||||
conn->use_shell = 1;
|
||||
putty = 0;
|
||||
} else {
|
||||
const char *base;
|
||||
char *ssh_dup;
|
||||
|
||||
ssh = getenv("GIT_SSH");
|
||||
if (!ssh)
|
||||
ssh = "ssh";
|
||||
putty = !!strcasestr(ssh, "plink");
|
||||
|
||||
ssh_dup = xstrdup(ssh);
|
||||
base = basename(ssh_dup);
|
||||
|
||||
tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
|
||||
!strcasecmp(base, "tortoiseplink.exe");
|
||||
putty = !strcasecmp(base, "plink") ||
|
||||
!strcasecmp(base, "plink.exe") || tortoiseplink;
|
||||
|
||||
free(ssh_dup);
|
||||
}
|
||||
|
||||
argv_array_push(&conn->args, ssh);
|
||||
if (putty && !strcasestr(ssh, "tortoiseplink"))
|
||||
if (tortoiseplink)
|
||||
argv_array_push(&conn->args, "-batch");
|
||||
if (port) {
|
||||
/* P is for PuTTY, p is for OpenSSH */
|
||||
|
Reference in New Issue
Block a user