General mechanism for ensuring a dodgy SFTP server can't return
[u/mdw/putty] / windows / winsftp.c
index d9ea3ca..82bea80 100644 (file)
@@ -445,6 +445,17 @@ void finish_wildcard_matching(WildcardMatcher *dir)
     sfree(dir);
 }
 
+int vet_filename(char *name)
+{
+    if (strchr(name, '/') || strchr(name, '\\') || strchr(name, ':'))
+       return FALSE;
+
+    if (!name[strspn(name, ".")])      /* entirely composed of dots */
+       return FALSE;
+
+    return TRUE;
+}
+
 int create_directory(char *name)
 {
     return CreateDirectory(name, NULL) != 0;
@@ -462,7 +473,7 @@ char *dir_file_cat(char *dir, char *file)
 /*
  * Be told what socket we're supposed to be using.
  */
-static SOCKET sftp_ssh_socket;
+static SOCKET sftp_ssh_socket = INVALID_SOCKET;
 static HANDLE netevent = NULL;
 char *do_select(SOCKET skt, int startup)
 {
@@ -676,7 +687,7 @@ static DWORD WINAPI command_read_thread(void *param)
     return 0;
 }
 
-char *ssh_sftp_get_cmdline(char *prompt)
+char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok)
 {
     int ret;
     struct command_read_ctx actx, *ctx = &actx;
@@ -685,7 +696,8 @@ char *ssh_sftp_get_cmdline(char *prompt)
     fputs(prompt, stdout);
     fflush(stdout);
 
-    if (sftp_ssh_socket == INVALID_SOCKET || p_WSAEventSelect == NULL) {
+    if ((sftp_ssh_socket == INVALID_SOCKET && no_fds_ok) ||
+       p_WSAEventSelect == NULL) {
        return fgetline(stdin);        /* very simple */
     }