From: djm@openbsd.org Date: Sat, 8 Jan 2022 07:36:11 +0000 (+0000) Subject: upstream: fix some corner-case bugs in scp sftp-mode handling of X-Git-Tag: V_8_9_P1~87 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63670d4e9030bcee490d5a9cce561373ac5b3b23;p=thirdparty%2Fopenssh-portable.git 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 --- diff --git a/scp.c b/scp.c index 7145d1a88..9ddaca183 100644 --- a/scp.c +++ b/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 * 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 * prepare_remote_path(struct sftp_conn *conn, const char *path) { + size_t nslash; + /* Handle ~ prefixed paths */ - if (*path != '~') - return xstrdup(path); if (*path == '\0' || strcmp(path, "~") == 0) return xstrdup("."); - if (strncmp(path, "~/", 2) == 0) - return xstrdup(path + 2); + if (*path != '~') + 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)) return do_expand_path(conn, path); /* No protocol extension */