diff options
author | Daniel Stenberg <daniel@haxx.se> | 2010-08-04 17:23:38 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2010-08-04 18:29:13 +0200 |
commit | f8cf037ecf67d4dc490e0e54fb2c691211e859ba (patch) | |
tree | b1e25f66a563d18a7b199312392454b624ddd644 | |
parent | 6028fdb3053657ae0bd099b704eca0e108ed9b7d (diff) |
SCP: send large files properly with new enough libssh2
libssh2 1.2.6 and later handle >32bit file sizes properly even on 32bit
architectures and we make sure to use that ability.
Reported by: Mikael Johansson
Bug: http://curl.haxx.se/mail/lib-2010-08/0052.html
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | lib/ssh.c | 16 | ||||
-rw-r--r-- | lib/ssh.h | 8 |
3 files changed, 23 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac index 633f9e49a..fe57875d9 100644 --- a/configure.ac +++ b/configure.ac @@ -1984,7 +1984,9 @@ if test X"$OPT_LIBSSH2" != Xno; then dnl libssh2_version is a post 1.0 addition dnl libssh2_init and libssh2_exit were added in 1.2.5 - AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit) + dnl libssh2_scp_send64 was added in 1.2.6 + AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit \ + libssh2_scp_send64 ) LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_SSH2" export LD_LIBRARY_PATH @@ -486,6 +486,17 @@ static int sshkeycallback(CURL *easy, #endif /* + * Earlier libssh2 versions didn't do SCP properly beyond 32bit sizes on 32bit + * architectures so we check of the necessary function is present. + */ +#ifdef HAVE_LIBSSH2_SCP_SEND64 +#define SCP_SEND(a,b,c,d) libssh2_scp_send_ex(a, b, (int)(c), (size_t)d, 0, 0) +#else +#define SCP_SEND(a,b,c,d) libssh2_scp_send64(a, b, (int)(c), \ + (libssh2_uint64_t)d, 0, 0) +#endif + +/* * ssh_statemach_act() runs the SSH state machine as far as it can without * blocking and without reaching the end. The data the pointer 'block' points * to will be set to TRUE if the libssh2 function returns LIBSSH2_ERROR_EAGAIN @@ -2083,9 +2094,8 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block) * directory in the path. */ sshc->ssh_channel = - libssh2_scp_send_ex(sshc->ssh_session, sftp_scp->path, - (int)(data->set.new_file_perms), - (size_t)data->set.infilesize, 0, 0); + SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms, + data->set.infilesize); if(!sshc->ssh_channel) { if(libssh2_session_last_errno(sshc->ssh_session) == LIBSSH2_ERROR_EAGAIN) { @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -158,6 +158,12 @@ struct ssh_conn { # undef HAVE_LIBSSH2_SFTP_SEEK64 #endif +#if defined(LIBSSH2_VERSION_NUM) && (LIBSSH2_VERSION_NUM >= 0x010206) +# define HAVE_LIBSSH2_SCP_SEND64 1 +#else +# undef HAVE_LIBSSH2_SFTP_SEEK64 +#endif + extern const struct Curl_handler Curl_handler_scp; extern const struct Curl_handler Curl_handler_sftp; |