diff options
Diffstat (limited to 'sftp-client.c')
-rw-r--r-- | sftp-client.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sftp-client.c b/sftp-client.c index e65c15c8f..a6e832270 100644 --- a/sftp-client.c +++ b/sftp-client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sftp-client.c,v 1.125 2016/09/12 01:22:38 deraadt Exp $ */ | 1 | /* $OpenBSD: sftp-client.c,v 1.126 2017/01/03 05:46:51 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> | 3 | * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> |
4 | * | 4 | * |
@@ -67,6 +67,13 @@ extern int showprogress; | |||
67 | /* Maximum depth to descend in directory trees */ | 67 | /* Maximum depth to descend in directory trees */ |
68 | #define MAX_DIR_DEPTH 64 | 68 | #define MAX_DIR_DEPTH 64 |
69 | 69 | ||
70 | /* Directory separator characters */ | ||
71 | #ifdef HAVE_CYGWIN | ||
72 | # define SFTP_DIRECTORY_CHARS "/\\" | ||
73 | #else /* HAVE_CYGWIN */ | ||
74 | # define SFTP_DIRECTORY_CHARS "/" | ||
75 | #endif /* HAVE_CYGWIN */ | ||
76 | |||
70 | struct sftp_conn { | 77 | struct sftp_conn { |
71 | int fd_in; | 78 | int fd_in; |
72 | int fd_out; | 79 | int fd_out; |
@@ -587,6 +594,8 @@ do_lsreaddir(struct sftp_conn *conn, const char *path, int print_flag, | |||
587 | 594 | ||
588 | if ((r = sshbuf_get_u32(msg, &count)) != 0) | 595 | if ((r = sshbuf_get_u32(msg, &count)) != 0) |
589 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); | 596 | fatal("%s: buffer error: %s", __func__, ssh_err(r)); |
597 | if (count > SSHBUF_SIZE_MAX) | ||
598 | fatal("%s: nonsensical number of entries", __func__); | ||
590 | if (count == 0) | 599 | if (count == 0) |
591 | break; | 600 | break; |
592 | debug3("Received %d SSH2_FXP_NAME responses", count); | 601 | debug3("Received %d SSH2_FXP_NAME responses", count); |
@@ -617,7 +626,7 @@ do_lsreaddir(struct sftp_conn *conn, const char *path, int print_flag, | |||
617 | * These can be used to attack recursive ops | 626 | * These can be used to attack recursive ops |
618 | * (e.g. send '../../../../etc/passwd') | 627 | * (e.g. send '../../../../etc/passwd') |
619 | */ | 628 | */ |
620 | if (strchr(filename, '/') != NULL) { | 629 | if (strpbrk(filename, SFTP_DIRECTORY_CHARS) != NULL) { |
621 | error("Server sent suspect path \"%s\" " | 630 | error("Server sent suspect path \"%s\" " |
622 | "during readdir of \"%s\"", filename, path); | 631 | "during readdir of \"%s\"", filename, path); |
623 | } else if (dir) { | 632 | } else if (dir) { |