非常に単純な実装を試みていますlibssh
が、valgrind はメモリリークを示しています。
コードは次のとおりです。
#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);
}
コンパイル:
gcc sshex.c -lssh
VALGRIND 実行:
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.
ダイレクトラン:
root@rohit-Precision-T1500:/# gcc sshex.c -lssh
root@rohit-Precision-T1500:/# ./a.out
already added
root@rohit-Precision-T1500:/#
Linux バージョン:
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
私はこれについて実験しました。関数ssh_connect()
(およびもちろん他の次の関数)を削除すると、リークは発生しません。したがって、この関数によってリークが発生したに違いありません。しかし、私の小さなプログラムでは、関数を使用して、ssh_disconnect()
によって割り当てられたメモリを解放しましたssh_connect()
。では、メモリが確実に解放されていることを確認するにはどうすればよいですか?
私のソフトウェアで SCP 機能を使用したいと考えています。そのため、メモリ リークは深刻な問題になるでしょう。libcrypto
私の理解によると、リークはおそらくリークではないライブラリに関連付けられていますlibssh
。そうである場合、またはそうでない場合、これらのリークを取り除くための解決策は何ですか? 私はどこで間違っていますか?