openssl庫函數使用中的SSL_shutdown、SSL_free不能同時使用

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



這兩個函數使用其中任意一個都可以,但不可同時使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章