diff options
author | Daniel Stenberg <daniel@haxx.se> | 2008-06-20 10:43:32 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2008-06-20 10:43:32 +0000 |
commit | 422fd933f508225d3d95128ba97ae3e38dff53dc (patch) | |
tree | 11a78f4d2d1a98996b8d9b8e3e8abb9316dee802 /lib/sendf.c | |
parent | 2594124825980231ffe024d00a9ac43bcb4c3553 (diff) | |
download | curl-422fd933f508225d3d95128ba97ae3e38dff53dc.tar.gz |
- Hans-Jurgen May pointed out that trying SCP or SFTP over a SOCKS proxy
crashed libcurl. This is now addressed by making sure we use "plain send"
internally when doing the socks handshake instead of the Curl_write()
function which is designed to use the "target" protocol. That's then SCP or
SFTP in this case. I also took the opportunity and cleaned up some ssh-
related #ifdefs in the code for readability.
Diffstat (limited to 'lib/sendf.c')
-rw-r--r-- | lib/sendf.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/lib/sendf.c b/lib/sendf.c index 3869a4d4f..52edbc4ce 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -356,16 +356,12 @@ CURLcode Curl_write(struct connectdata *conn, int num = (sockfd == conn->sock[SECONDARYSOCKET]); if(conn->ssl[num].state == ssl_connection_complete) - /* only TRUE if SSL enabled */ bytes_written = Curl_ssl_send(conn, num, mem, len); -#ifdef USE_LIBSSH2 - else if(conn->protocol & PROT_SCP) + else if(Curl_ssh_enabled(conn, PROT_SCP)) bytes_written = Curl_scp_send(conn, num, mem, len); - else if(conn->protocol & PROT_SFTP) + else if(Curl_ssh_enabled(conn, PROT_SFTP)) bytes_written = Curl_sftp_send(conn, num, mem, len); -#endif /* !USE_LIBSSH2 */ else if(conn->sec_complete) - /* only TRUE if krb enabled */ bytes_written = Curl_sec_send(conn, num, mem, len); else bytes_written = send_plain(conn, num, mem, len); @@ -376,6 +372,29 @@ CURLcode Curl_write(struct connectdata *conn, return retcode; } +/* + * Curl_write_plain() is an internal write function that sends data to the + * server using plain sockets only. Otherwise meant to have the exact same + * proto as Curl_write() + */ +CURLcode Curl_write_plain(struct connectdata *conn, + curl_socket_t sockfd, + const void *mem, + size_t len, + ssize_t *written) +{ + ssize_t bytes_written; + CURLcode retcode; + int num = (sockfd == conn->sock[SECONDARYSOCKET]); + + bytes_written = send_plain(conn, num, mem, len); + + *written = bytes_written; + retcode = (-1 != bytes_written)?CURLE_OK:CURLE_SEND_ERROR; + + return retcode; +} + static CURLcode pausewrite(struct SessionHandle *data, int type, /* what type of data */ char *ptr, @@ -574,8 +593,7 @@ int Curl_read(struct connectdata *conn, /* connection data */ return -1; /* -1 from Curl_ssl_recv() means EWOULDBLOCK */ } } -#ifdef USE_LIBSSH2 - else if(conn->protocol & (PROT_SCP|PROT_SFTP)) { + else if(Curl_ssh_enabled(conn, (PROT_SCP|PROT_SFTP))) { if(conn->protocol & PROT_SCP) nread = Curl_scp_recv(conn, num, buffertofill, bytesfromsocket); else if(conn->protocol & PROT_SFTP) @@ -589,7 +607,6 @@ int Curl_read(struct connectdata *conn, /* connection data */ /* since it is negative and not EGAIN, it was a protocol-layer error */ return CURLE_RECV_ERROR; } -#endif /* !USE_LIBSSH2 */ else { if(conn->sec_complete) nread = Curl_sec_read(conn, sockfd, buffertofill, |