openssl库函数中提供了两个销毁ssl连接通道的函数:SSL_shutdown、SSL_free,作用相同,二者取其一,不可同时使用,否则就会出现两次销毁对象的报错。
请看下面一个代码片段:
......
if (SSL_shutdown(ssl) != 1)
{
close(sfd);
printf("ssl shutdown failed\n");
}
SSL_free(ssl);
......
使用-lssl参数编译可以成功,但在运行时,会概率性出现double free or corruption的报错,就是销毁一个已经销毁的对象。详细的报错信息类似于:
root@xubuntu:/home# ./s
*** glibc detected *** ./s: double free or corruption (!prev): 0x095c0f60 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0x251ee2]
/lib/i386-linux-gnu/libcrypto.so.1.0.0(CRYPTO_free+0x3a)[0x3bf95a]
/lib/i386-linux-gnu/libcrypto.so.1.0.0(BIO_free+0xe0)[0x430610]
/lib/i386-linux-gnu/libcrypto.so.1.0.0(BIO_free_all+0x34)[0x431194]
/lib/i386-linux-gnu/libssl.so.1.0.0(SSL_set_bio+0x49)[0x889d79]
/lib/i386-linux-gnu/libssl.so.1.0.0(SSL_set_fd+0x57)[0x889f17]
./s[0x8048aee]
/lib/i386-linux-gnu/libpthread.so.0(+0x6d4c)[0xb93d4c]
/lib/i386-linux-gnu/libc.so.6(clone+0x5e)[0x2cbbae]
======= Memory map: ========
00110000-00124000 r-xp 00000000 08:02 4893 /lib/i386-linux-gnu/libz.so.1.2.3.4
00124000-00125000 r--p 00013000 08:02 4893 /lib/i386-linux-gnu/libz.so.1.2.3.4
00125000-00126000 rw-p 00014000 08:02 4893 /lib/i386-linux-gnu/libz.so.1.2.3.4
00126000-00142000 r-xp 00000000 08:02 760 /lib/i386-linux-gnu/libgcc_s.so.1
00142000-00143000 r--p 0001b000 08:02 760 /lib/i386-linux-gnu/libgcc_s.so.1
00143000-00144000 rw-p 0001c000 08:02 760 /lib/i386-linux-gnu/libgcc_s.so.1
001dc000-00380000 r-xp 00000000 08:02 3232 /lib/i386-linux-gnu/libc-2.15.so
00380000-00382000 r--p 001a4000 08:02 3232 /lib/i386-linux-gnu/libc-2.15.so
00382000-00383000 rw-p 001a6000 08:02 3232 /lib/i386-linux-gnu/libc-2.15.so
00383000-00386000 rw-p 00000000 00:00 0
00386000-00519000 r-xp 00000000 08:02 5861 /lib/i386-linux-gnu/libcrypto.so.1.0.0
00519000-00528000 r--p 00193000 08:02 5861 /lib/i386-linux-gnu/libcrypto.so.1.0.0
00528000-0052f000 rw-p 001a2000 08:02 5861 /lib/i386-linux-gnu/libcrypto.so.1.0.0
0052f000-00532000 rw-p 00000000 00:00 0
00759000-0075c000 r-xp 00000000 08:02 3231 /lib/i386-linux-gnu/libdl-2.15.so
0075c000-0075d000 r--p 00002000 08:02 3231 /lib/i386-linux-gnu/libdl-2.15.so
0075d000-0075e000 rw-p 00003000 08:02 3231 /lib/i386-linux-gnu/libdl-2.15.so
00858000-008a9000 r-xp 00000000 08:02 5862 /lib/i386-linux-gnu/libssl.so.1.0.0
008a9000-008ab000 r--p 00051000 08:02 5862 /lib/i386-linux-gnu/libssl.so.1.0.0
008ab000-008af000 rw-p 00053000 08:02 5862 /lib/i386-linux-gnu/libssl.so.1.0.0
00af6000-00b16000 r-xp 00000000 08:02 3222 /lib/i386-linux-gnu/ld-2.15.so
00b16000-00b17000 r--p 0001f000 08:02 3222 /lib/i386-linux-gnu/ld-2.15.so
00b17000-00b18000 rw-p 00020000 08:02 3222 /lib/i386-linux-gnu/ld-2.15.so
00b8d000-00ba4000 r-xp 00000000 08:02 3221 /lib/i386-linux-gnu/libpthread-2.15.so
00ba4000-00ba5000 r--p 00016000 08:02 3221 /lib/i386-linux-gnu/libpthread-2.15.so
00ba5000-00ba6000 rw-p 00017000 08:02 3221 /lib/i386-linux-gnu/libpthread-2.15.so
00ba6000-00ba8000 rw-p 00000000 00:00 0
00fed000-00fee000 r-xp 00000000 00:00 0 [vdso]
08048000-0804a000 r-xp 00000000 08:02 260187 /home/s
0804a000-0804b000 r--p 00001000 08:02 260187 /home/s
0804b000-0804c000 rw-p 00002000 08:02 260187 /home/s
095b3000-095d4000 rw-p 00000000 00:00 0 [heap]
b4c00000-b4c21000 rw-p 00000000 00:00 0
b4c21000-b4d00000 ---p 00000000 00:00 0
b4e00000-b4e21000 rw-p 00000000 00:00 0
b4e21000-b4f00000 ---p 00000000 00:00 0
b4f52000-b4f53000 ---p 00000000 00:00 0
b4f53000-b5753000 rw-p 00000000 00:00 0
b5753000-b5754000 ---p 00000000 00:00 0
b5754000-b5f54000 rw-p 00000000 00:00 0
b5f54000-b5f55000 ---p 00000000 00:00 0
b5f55000-b6755000 rw-p 00000000 00:00 0
b6755000-b6756000 ---p 00000000 00:00 0
b6756000-b6f56000 rw-p 00000000 00:00 0
b6f56000-b6f57000 ---p 00000000 00:00 0
b6f57000-b775a000 rw-p 00000000 00:00 0
b7763000-b7766000 rw-p 00000000 00:00 0
bf89e000-bf8bf000 rw-p 00000000 00:00 0 [stack]
Aborted
这两个函数使用其中任意一个都可以,但不可同时使用。