diff --git a/src/scp.c b/src/scp.c index fb29d0c6..ec2d1a2e 100644 --- a/src/scp.c +++ b/src/scp.c @@ -874,6 +874,22 @@ int ssh_scp_pull_request(ssh_scp scp) size = strtoull(tmp, NULL, 10); p++; name = strdup(p); + /* Catch invalid name: + * - empty ones + * - containing any forward slash -- directory traversal handled + * differently + * - special names "." and ".." referring to the current and parent + * directories -- they are not expected either + */ + if (name == NULL || name[0] == '\0' || strchr(name, '/') || + strcmp(name, ".") == 0 || strcmp(name, "..") == 0) { + ssh_set_error(scp->session, + SSH_FATAL, + "Received invalid filename: %s", + name == NULL ? "" : name); + SAFE_FREE(name); + goto error; + } SAFE_FREE(scp->request_name); scp->request_name = name; if (buffer[0] == 'C') {