From 3f71c81f494cdd5033a86dbd2fa1096ce285e9ff Mon Sep 17 00:00:00 2001 From: quamrulmina Date: Thu, 1 Oct 2015 19:54:56 -0500 Subject: [PATCH] sftp-server.exe put now works Fixed sftp-server put verb not working. Tested from out sftp client and linux fedora openssh 6.9p1 sftp clients in transferring small and large files using both get and put verbs. --- sftp-server.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/sftp-server.c b/sftp-server.c index 948e2c6..e2a1db4 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1730,6 +1730,10 @@ process_extended(u_int32_t id) /* stolen from ssh-agent */ +#ifdef WIN32_FIXME +int readsomemore=0; +#endif + static void process(void) { @@ -1741,9 +1745,18 @@ process(void) int i, r; u_int32_t id; + #ifdef WIN32_FIXME + // we use to tell our caller to read more data if a message is not complete + readsomemore=0; + #endif + buf_len = sshbuf_len(iqueue); - if (buf_len < 5) + if (buf_len < 5) { + #ifdef WIN32_FIXME + readsomemore =1; + #endif return; /* Incomplete message. */ + } cp = sshbuf_ptr(iqueue); msg_len = get_u32(cp); if (msg_len > SFTP_MAX_MSG_LENGTH) { @@ -1751,8 +1764,12 @@ process(void) client_addr, pw->pw_name); sftp_server_cleanup_exit(11); } - if (buf_len < msg_len + 4) + if (buf_len < msg_len + 4) { + #ifdef WIN32_FIXME + readsomemore =1; + #endif return; + } if ((r = sshbuf_consume(iqueue, 4)) != 0) fatal("%s: buffer error: %s", __func__, ssh_err(r)); buf_len -= 4; @@ -1834,9 +1851,13 @@ sftp_server_usage(void) #ifdef WIN32_FIXME DWORD select_in_handle( HANDLE in_handle) { - DWORD bytesavail = 0 ; - //rc = WaitForSingleObject (in_handle, 0); + //DWORD rc = WaitForSingleObject (in_handle, 0); + //if (rc == WAIT_OBJECT_0) + // return 1; + //else + // return 0; + DWORD bytesavail = 0 ; PeekNamedPipe(in_handle, NULL,0, NULL, &bytesavail, NULL ); return bytesavail; } @@ -2098,7 +2119,7 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw) /* copy stdin to iqueue */ if ( select_read ) { - if ( select_in_handle(in_handle) || ( sshbuf_len(iqueue) <= 0)) { + if ( readsomemore || ( sshbuf_len(iqueue) <= 0)) { len = _read(in, buf, sizeof buf); if (len == 0) { debug("read eof");