summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2011-09-08 11:08:00 +0200
committerYang Tse <yangsita@gmail.com>2011-09-08 11:08:00 +0200
commit7b7c45879e5ec6fb2f531860f483197955b2aaea (patch)
tree0a37fe35a944ab8c34870692c68ad3f2b105976c
parent81ead2c4e75a686729586ffb07d79e2efe2a60ba (diff)
downloadgnurl-7b7c45879e5ec6fb2f531860f483197955b2aaea.tar.gz
gnurl-7b7c45879e5ec6fb2f531860f483197955b2aaea.tar.bz2
gnurl-7b7c45879e5ec6fb2f531860f483197955b2aaea.zip
libssh2: use calloc as alloc function for libssh2 versions older than 1.3
This workarounds old libssh2 versions not properly initializing some ssh session variables, which would trigger memory debuggers warnings on memory being used without having been initialized.
-rw-r--r--lib/ssh.c60
1 files changed, 57 insertions, 3 deletions
diff --git a/lib/ssh.c b/lib/ssh.c
index 089b76110..d92ca212b 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -111,6 +111,7 @@
/* Local functions: */
static const char *sftp_libssh2_strerror(unsigned long err);
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
+static LIBSSH2_ALLOC_FUNC(my_libssh2_calloc);
static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc);
static LIBSSH2_FREE_FUNC(my_libssh2_free);
@@ -199,6 +200,44 @@ const struct Curl_handler Curl_handler_sftp = {
static void
+libssh2_version_components(int *major, int *minor, int *patch)
+{
+ char buff[80];
+ char *ptr = &buff[0];
+ *major = 0;
+ *minor = 0;
+ *patch = 0;
+#ifdef HAVE_LIBSSH2_VERSION
+ /* run-time version */
+ snprintf(buff, sizeof(buff), "%s", libssh2_version(0));
+#else
+ /* compile-time version */
+ snprintf(buff, sizeof(buff), "%s", LIBSSH2_VERSION);
+#endif
+ while(ptr && ISDIGIT(*ptr)) {
+ *major *= 10;
+ *major += *ptr - '0';
+ ptr++;
+ }
+ if(*ptr == '.') {
+ ptr++;
+ while(ptr && ISDIGIT(*ptr)) {
+ *minor *= 10;
+ *minor += *ptr - '0';
+ ptr++;
+ }
+ if(*ptr == '.') {
+ ptr++;
+ while(ptr && ISDIGIT(*ptr)) {
+ *patch *= 10;
+ *patch += *ptr - '0';
+ ptr++;
+ }
+ }
+ }
+}
+
+static void
kbd_callback(const char *name, int name_len, const char *instruction,
int instruction_len, int num_prompts,
const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,
@@ -305,6 +344,12 @@ static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc)
return malloc(count);
}
+static LIBSSH2_ALLOC_FUNC(my_libssh2_calloc)
+{
+ (void)abstract; /* arg not used */
+ return calloc(1, count);
+}
+
static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc)
{
(void)abstract; /* arg not used */
@@ -2625,6 +2670,9 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
#endif
struct ssh_conn *ssh;
CURLcode result;
+ int major = 0;
+ int minor = 0;
+ int patch = 0;
struct SessionHandle *data = conn->data;
/* We default to persistent connections. We set this already in this connect
@@ -2659,9 +2707,15 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
sock = conn->sock[FIRSTSOCKET];
#endif /* CURL_LIBSSH2_DEBUG */
- ssh->ssh_session = libssh2_session_init_ex(my_libssh2_malloc,
- my_libssh2_free,
- my_libssh2_realloc, conn);
+ libssh2_version_components(&major, &minor, &patch);
+ if((major < 1) || ((major == 1) && (minor < 3)))
+ ssh->ssh_session = libssh2_session_init_ex(my_libssh2_calloc,
+ my_libssh2_free,
+ my_libssh2_realloc, conn);
+ else
+ ssh->ssh_session = libssh2_session_init_ex(my_libssh2_malloc,
+ my_libssh2_free,
+ my_libssh2_realloc, conn);
if(ssh->ssh_session == NULL) {
failf(data, "Failure initialising ssh session");
return CURLE_FAILED_INIT;