I am trying a very simple implementation of libssh but valgrind shows memory leak.
The code is:
#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
ssh_session my_ssh_session = ssh_new();
int port = 22;
int rc, state;
const char *ip = "192.168.125.241";
char *password;
if (my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, ip);
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
rc = ssh_connect(my_ssh_session);
if (rc != SSH_OK)
{
fprintf(stderr, "Error connecting to localhost: %s\n",
ssh_get_error(my_ssh_session));
exit(-1);
}
state = ssh_is_server_known(my_ssh_session);
if(state == SSH_SERVER_KNOWN_OK)
printf("already added\n");
else
printf("require addition\n");
rc = ssh_userauth_password(my_ssh_session, "rohit", "password");
if (rc != SSH_AUTH_SUCCESS)
{
fprintf(stderr, "Error authenticating with password: %s\n",
ssh_get_error(my_ssh_session));
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
exit(-1);
}
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
}
COMPILATION:
gcc sshex.c -lssh
VALGRIND RUN:
root@rohit-Precision-T1500:/# valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --show-reachable=no ./a.out
==1937== Memcheck, a memory error detector
==1937== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==1937== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==1937== Command: ./a.out
==1937==
yahoo
==1937==
==1937== HEAP SUMMARY:
==1937== in use at exit: 14,256 bytes in 521 blocks
==1937== total heap usage: 1,339 allocs, 818 frees, 92,442 bytes allocated
==1937==
==1937== 24 bytes in 1 blocks are indirectly lost in loss record 507 of 520
==1937== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1937== by 0x56AAD32: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3A59: BN_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3F07: BN_bin2bn (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x4E6079B: pki_signature_from_blob (pki_crypto.c:1384)
==1937== by 0x4E599F9: ssh_pki_import_signature_blob (pki.c:1262)
==1937== by 0x4E59A77: ssh_pki_signature_verify_blob (pki.c:1281)
==1937== by 0x4E578DE: ssh_packet_newkeys (packet_cb.c:186)
==1937== by 0x4E56E6F: ssh_packet_process (packet.c:422)
==1937== by 0x4E57374: ssh_packet_socket_callback (packet.c:326)
==1937== by 0x4E573B3: ssh_packet_socket_callback (packet.c:336)
==1937== by 0x4E5D951: ssh_socket_pollcallback (socket.c:290)
==1937==
==1937== 24 bytes in 1 blocks are indirectly lost in loss record 508 of 520
==1937== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1937== by 0x56AAD32: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3A59: BN_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3F07: BN_bin2bn (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x4E607EC: pki_signature_from_blob (pki_crypto.c:1405)
==1937== by 0x4E599F9: ssh_pki_import_signature_blob (pki.c:1262)
==1937== by 0x4E59A77: ssh_pki_signature_verify_blob (pki.c:1281)
==1937== by 0x4E578DE: ssh_packet_newkeys (packet_cb.c:186)
==1937== by 0x4E56E6F: ssh_packet_process (packet.c:422)
==1937== by 0x4E57374: ssh_packet_socket_callback (packet.c:326)
==1937== by 0x4E573B3: ssh_packet_socket_callback (packet.c:336)
==1937== by 0x4E5D951: ssh_socket_pollcallback (socket.c:290)
==1937==
==1937== 32 bytes in 1 blocks are indirectly lost in loss record 511 of 520
==1937== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1937== by 0x56AAD32: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E35E6: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3AD4: bn_expand2 (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3ECF: BN_bin2bn (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x4E6079B: pki_signature_from_blob (pki_crypto.c:1384)
==1937== by 0x4E599F9: ssh_pki_import_signature_blob (pki.c:1262)
==1937== by 0x4E59A77: ssh_pki_signature_verify_blob (pki.c:1281)
==1937== by 0x4E578DE: ssh_packet_newkeys (packet_cb.c:186)
==1937== by 0x4E56E6F: ssh_packet_process (packet.c:422)
==1937== by 0x4E57374: ssh_packet_socket_callback (packet.c:326)
==1937== by 0x4E573B3: ssh_packet_socket_callback (packet.c:336)
==1937==
==1937== 32 bytes in 1 blocks are indirectly lost in loss record 512 of 520
==1937== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1937== by 0x56AAD32: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E35E6: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3AD4: bn_expand2 (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3ECF: BN_bin2bn (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x4E607EC: pki_signature_from_blob (pki_crypto.c:1405)
==1937== by 0x4E599F9: ssh_pki_import_signature_blob (pki.c:1262)
==1937== by 0x4E59A77: ssh_pki_signature_verify_blob (pki.c:1281)
==1937== by 0x4E578DE: ssh_packet_newkeys (packet_cb.c:186)
==1937== by 0x4E56E6F: ssh_packet_process (packet.c:422)
==1937== by 0x4E57374: ssh_packet_socket_callback (packet.c:326)
==1937== by 0x4E573B3: ssh_packet_socket_callback (packet.c:336)
==1937==
==1937== 48 bytes in 2 blocks are definitely lost in loss record 513 of 520
==1937== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1937== by 0x56AAD32: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x56E3A59: BN_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x574C358: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x5750B1A: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x5750BC5: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x5750D79: ASN1_item_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x4E60734: pki_signature_from_blob (pki_crypto.c:1347)
==1937== by 0x4E599F9: ssh_pki_import_signature_blob (pki.c:1262)
==1937== by 0x4E59A77: ssh_pki_signature_verify_blob (pki.c:1281)
==1937== by 0x4E578DE: ssh_packet_newkeys (packet_cb.c:186)
==1937== by 0x4E56E6F: ssh_packet_process (packet.c:422)
==1937==
==1937== 128 (16 direct, 112 indirect) bytes in 1 blocks are definitely lost in loss record 516 of 520
==1937== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1937== by 0x56AAD32: CRYPTO_malloc (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x5750D0B: ??? (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x5750D79: ASN1_item_new (in /lib/x86_64-linux-gnu/libcrypto.so.1.0.0)
==1937== by 0x4E60734: pki_signature_from_blob (pki_crypto.c:1347)
==1937== by 0x4E599F9: ssh_pki_import_signature_blob (pki.c:1262)
==1937== by 0x4E59A77: ssh_pki_signature_verify_blob (pki.c:1281)
==1937== by 0x4E578DE: ssh_packet_newkeys (packet_cb.c:186)
==1937== by 0x4E56E6F: ssh_packet_process (packet.c:422)
==1937== by 0x4E57374: ssh_packet_socket_callback (packet.c:326)
==1937== by 0x4E573B3: ssh_packet_socket_callback (packet.c:336)
==1937== by 0x4E5D951: ssh_socket_pollcallback (socket.c:290)
==1937==
==1937== LEAK SUMMARY:
==1937== definitely lost: 64 bytes in 3 blocks
==1937== indirectly lost: 112 bytes in 4 blocks
==1937== possibly lost: 0 bytes in 0 blocks
==1937== still reachable: 14,080 bytes in 514 blocks
==1937== suppressed: 0 bytes in 0 blocks
==1937== Reachable blocks (those to which a pointer was found) are not shown.
DIRECT RUN:
root@rohit-Precision-T1500:/# gcc sshex.c -lssh
root@rohit-Precision-T1500:/# ./a.out
already added
root@rohit-Precision-T1500:/#
LINUX VERSION:
root@rohit-Precision-T1500:/# uname -a
Linux rohit-Precision-T1500 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
I have experimented on this. If I remove the function ssh_connect() (and other following functions of course), then I don't get any leak. So, the leak must have been raised by this function. But in my little program, I have used the function ssh_disconnect() to release the memory allocated by ssh_connect(). So, How can I make sure the memory is freed for sure?
I would like to use SCP functionality in my software and that will be a long lived process. So, the memory leak is going to be a serious concern.
As per my understanding, the leaks are associated with libcrypto library which probably is not leak of libssh. If, it is or otherwise, what is the solution to get rid of these leaks?
Where am i doing wrong?