upstream: fix some corner-case bugs in scp sftp-mode handling of
~-prefixed paths; spotted by jsg; feedback jsg & deraadt, ok jsg & markus OpenBSD-Commit-ID: d1697dbaaa9f0f5649d69be897eab25c7d37c222
This commit is contained in:
parent
e14940bbec
commit
63670d4e90
15
scp.c
15
scp.c
|
@ -1,4 +1,4 @@
|
||||||
/* $OpenBSD: scp.c,v 1.241 2021/10/24 21:24:17 deraadt Exp $ */
|
/* $OpenBSD: scp.c,v 1.242 2022/01/08 07:36:11 djm Exp $ */
|
||||||
/*
|
/*
|
||||||
* scp - secure remote copy. This is basically patched BSD rcp which
|
* scp - secure remote copy. This is basically patched BSD rcp which
|
||||||
* uses ssh to do the data transfer (instead of using rcmd).
|
* uses ssh to do the data transfer (instead of using rcmd).
|
||||||
|
@ -1250,13 +1250,18 @@ tolocal(int argc, char **argv, enum scp_mode_e mode, char *sftp_direct)
|
||||||
static char *
|
static char *
|
||||||
prepare_remote_path(struct sftp_conn *conn, const char *path)
|
prepare_remote_path(struct sftp_conn *conn, const char *path)
|
||||||
{
|
{
|
||||||
|
size_t nslash;
|
||||||
|
|
||||||
/* Handle ~ prefixed paths */
|
/* Handle ~ prefixed paths */
|
||||||
if (*path != '~')
|
|
||||||
return xstrdup(path);
|
|
||||||
if (*path == '\0' || strcmp(path, "~") == 0)
|
if (*path == '\0' || strcmp(path, "~") == 0)
|
||||||
return xstrdup(".");
|
return xstrdup(".");
|
||||||
if (strncmp(path, "~/", 2) == 0)
|
if (*path != '~')
|
||||||
return xstrdup(path + 2);
|
return xstrdup(path);
|
||||||
|
if (strncmp(path, "~/", 2) == 0) {
|
||||||
|
if ((nslash = strspn(path + 2, "/")) == strlen(path + 2))
|
||||||
|
return xstrdup(".");
|
||||||
|
return xstrdup(path + 2 + nslash);
|
||||||
|
}
|
||||||
if (can_expand_path(conn))
|
if (can_expand_path(conn))
|
||||||
return do_expand_path(conn, path);
|
return do_expand_path(conn, path);
|
||||||
/* No protocol extension */
|
/* No protocol extension */
|
||||||
|
|
Loading…
Reference in New Issue