Skip to content

Commit 5c586ac

Browse files
committed
Merge branch 'topic/test-memory-leak'
* topic/test-memory-leak: Enable OSSL_MDEBUG on CI builds Add OpenSSL.print_mem_leaks test: prepare test PKey instances on demand test: let OpenSSL::TestCase include OpenSSL::TestUtils Don't define main() when built with --enable-debug
2 parents a1b4a89 + 53f85b9 commit 5c586ac

27 files changed

+388
-311
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ script:
1717
matrix:
1818
fast_finish: true
1919
include:
20-
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=openssl-1.0.1 OSSL_MDEBUG=1
21-
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=openssl-1.0.2 OSSL_MDEBUG=1
22-
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=openssl-1.1.0 OSSL_MDEBUG=1
20+
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=openssl-1.0.1
21+
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=openssl-1.0.2
22+
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=openssl-1.1.0
2323
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=libressl-2.3
2424
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=libressl-2.4
2525
- env: RUBY_VERSION=ruby-2.3 OPENSSL_VERSION=libressl-2.5

appveyor.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ install:
77
- 7z x -y -oC:\Ruby%ruby_version% openssl-1.0.2j-x64-windows.tar
88
- ruby -S rake install_dependencies
99
build_script:
10-
- rake -rdevkit compile -- --with-openssl-dir=C:\Ruby%ruby_version%
10+
- rake -rdevkit compile -- --with-openssl-dir=C:\Ruby%ruby_version% --enable-debug
1111
test_script:
12-
- rake test
12+
- rake test OSSL_MDEBUG=1
1313
deploy: off
1414
environment:
1515
matrix:

docker-compose.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ compile: &defaults
33
environment:
44
RUBY_VERSION:
55
OPENSSL_VERSION:
6-
MDEBUG:
76
command: rake compile
87
test:
98
<<: *defaults
10-
command: rake compile test
9+
command: rake compile test OSSL_MDEBUG=1 -- --enable-debug
1110
debug:
1211
<<: *defaults
1312
command: /bin/bash

ext/openssl/ossl.c

Lines changed: 100 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,72 @@ ossl_fips_mode_set(VALUE self, VALUE enabled)
426426
#endif
427427
}
428428

429+
#if defined(OSSL_DEBUG)
430+
#if !defined(LIBRESSL_VERSION_NUMBER) && \
431+
(OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_NO_CRYPTO_MDEBUG) || \
432+
defined(CRYPTO_malloc_debug_init))
433+
/*
434+
* call-seq:
435+
* OpenSSL.mem_check_start -> nil
436+
*
437+
* Calls CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON). Starts tracking memory
438+
* allocations. See also OpenSSL.print_mem_leaks.
439+
*
440+
* This is available only when built with a capable OpenSSL and --enable-debug
441+
* configure option.
442+
*/
443+
static VALUE
444+
mem_check_start(VALUE self)
445+
{
446+
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
447+
return Qnil;
448+
}
449+
450+
/*
451+
* call-seq:
452+
* OpenSSL.print_mem_leaks -> true | false
453+
*
454+
* For debugging the Ruby/OpenSSL library. Calls CRYPTO_mem_leaks_fp(stderr).
455+
* Prints detected memory leaks to standard error. This cleans the global state
456+
* up thus you cannot use any methods of the library after calling this.
457+
*
458+
* Returns true if leaks detected, false otherwise.
459+
*
460+
* This is available only when built with a capable OpenSSL and --enable-debug
461+
* configure option.
462+
*
463+
* === Example
464+
* OpenSSL.mem_check_start
465+
* NOT_GCED = OpenSSL::PKey::RSA.new(256)
466+
*
467+
* END {
468+
* GC.start
469+
* OpenSSL.print_mem_leaks # will print the leakage
470+
* }
471+
*/
472+
static VALUE
473+
print_mem_leaks(VALUE self)
474+
{
475+
#if OPENSSL_VERSION_NUMBER >= 0x10100000
476+
int ret;
477+
#endif
478+
479+
BN_CTX_free(ossl_bn_ctx);
480+
ossl_bn_ctx = NULL;
481+
482+
#if OPENSSL_VERSION_NUMBER >= 0x10100000
483+
ret = CRYPTO_mem_leaks_fp(stderr);
484+
if (ret < 0)
485+
ossl_raise(eOSSLError, "CRYPTO_mem_leaks_fp");
486+
return ret ? Qfalse : Qtrue;
487+
#else
488+
CRYPTO_mem_leaks_fp(stderr);
489+
return Qnil;
490+
#endif
491+
}
492+
#endif
493+
#endif
494+
429495
#if !defined(HAVE_OPENSSL_110_THREADING_API)
430496
/**
431497
* Stores locks needed for OpenSSL thread safety
@@ -1114,15 +1180,40 @@ Init_openssl(void)
11141180
Init_ossl_ocsp();
11151181
Init_ossl_engine();
11161182
Init_ossl_asn1();
1117-
}
11181183

11191184
#if defined(OSSL_DEBUG)
1120-
/*
1121-
* Check if all symbols are OK with 'make LDSHARED=gcc all'
1122-
*/
1123-
int
1124-
main(int argc, char *argv[])
1125-
{
1126-
return 0;
1185+
/*
1186+
* For debugging Ruby/OpenSSL. Enable only when built with --enable-debug
1187+
*/
1188+
#if !defined(LIBRESSL_VERSION_NUMBER) && \
1189+
(OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(OPENSSL_NO_CRYPTO_MDEBUG) || \
1190+
defined(CRYPTO_malloc_debug_init))
1191+
rb_define_module_function(mOSSL, "mem_check_start", mem_check_start, 0);
1192+
rb_define_module_function(mOSSL, "print_mem_leaks", print_mem_leaks, 0);
1193+
1194+
#if defined(CRYPTO_malloc_debug_init) /* <= 1.0.2 */
1195+
CRYPTO_malloc_debug_init();
1196+
#endif
1197+
1198+
#if defined(V_CRYPTO_MDEBUG_ALL) /* <= 1.0.2 */
1199+
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
1200+
#endif
1201+
1202+
#if OPENSSL_VERSION_NUMBER < 0x10100000 /* <= 1.0.2 */
1203+
{
1204+
int i;
1205+
/*
1206+
* See crypto/ex_data.c; call def_get_class() immediately to avoid
1207+
* allocations. 15 is the maximum number that is used as the class index
1208+
* in OpenSSL 1.0.2.
1209+
*/
1210+
for (i = 0; i <= 15; i++) {
1211+
if (CRYPTO_get_ex_new_index(i, 0, (void *)"ossl-mdebug-dummy", 0, 0, 0) < 0)
1212+
rb_raise(rb_eRuntimeError, "CRYPTO_get_ex_new_index for "
1213+
"class index %d failed", i);
1214+
}
1215+
}
1216+
#endif
1217+
#endif
1218+
#endif
11271219
}
1128-
#endif /* OSSL_DEBUG */

test/fixtures/pkey/dh1024.pem

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN DH PARAMETERS-----
2+
MIGHAoGBAKnKQ8MNK6nYZzLrrcuTsLxuiJGXoOO5gT+tljOTbHBuiktdMTITzIY0
3+
pFxIvjG05D7HoBZQfrR0c92NGWPkAiCkhQKB8JCbPVzwNLDy6DZ0pmofDKrEsYHG
4+
AQjjxMXhwULlmuR/K+WwlaZPiLIBYalLAZQ7ZbOPeVkJ8ePao0eLAgEC
5+
-----END DH PARAMETERS-----

test/fixtures/pkey/dsa1024.pem

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN DSA PRIVATE KEY-----
2+
MIIBugIBAAKBgQCH9aAoXvWWThIjkA6D+nI1F9ksF9iDq594rkiGNOT9sPDOdB+n
3+
D+qeeeeloRlj19ymCSADPI0ZLRgkchkAEnY2RnqnhHOjVf/roGgRbW+iQDMbQ9wa
4+
/pvc6/fAbsu1goE1hBYjm98/sZEeXavj8tR56IXnjF1b6Nx0+sgeUKFKEQIVAMiz
5+
4BJUFeTtddyM4uadBM7HKLPRAoGAZdLBSYNGiij7vAjesF5mGUKTIgPd+JKuBEDx
6+
OaBclsgfdoyoF/TMOkIty+PVlYD+//Vl2xnoUEIRaMXHwHfm0r2xUX++oeRaSScg
7+
YizJdUxe5jvBuBszGPRc/mGpb9YvP0sB+FL1KmuxYmdODfCe51zl8uM/CVhouJ3w
8+
DjmRGscCgYAuFlfC7p+e8huCKydfcv/beftqjewiOPpQ3u5uI6KPCtCJPpDhs3+4
9+
IihH2cPsAlqwGF4tlibW1+/z/OZ1AZinPK3y7b2jSJASEaPeEltVzB92hcd1khk2
10+
jTYcmSsV4VddplOPK9czytR/GbbibxsrhhgZUbd8LPbvIgaiadJ1PgIUBnJ/5vN2
11+
CVArsEzlPUCbohPvZnE=
12+
-----END DSA PRIVATE KEY-----

test/fixtures/pkey/dsa256.pem

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN DSA PRIVATE KEY-----
2+
MIH3AgEAAkEAhk2libbY2a8y2Pt21+YPYGZeW6wzaW2yfj5oiClXro9XMR7XWLkE
3+
9B7XxLNFCS2gmCCdMsMW1HulaHtLFQmB2wIVAM43JZrcgpu6ajZ01VkLc93gu/Ed
4+
AkAOhujZrrKV5CzBKutKLb0GVyVWmdC7InoNSMZEeGU72rT96IjM59YzoqmD0pGM
5+
3I1o4cGqg1D1DfM1rQlnN1eSAkBq6xXfEDwJ1mLNxF6q8Zm/ugFYWR5xcX/3wFiT
6+
b4+EjHP/DbNh9Vm5wcfnDBJ1zKvrMEf2xqngYdrV/3CiGJeKAhRvL57QvJZcQGvn
7+
ISNX5cMzFHRW3Q==
8+
-----END DSA PRIVATE KEY-----

test/fixtures/pkey/dsa512.pem

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN DSA PRIVATE KEY-----
2+
MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
3+
RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
4+
AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
5+
S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
6+
Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
7+
55jreJD3Se3slps=
8+
-----END DSA PRIVATE KEY-----

test/fixtures/pkey/p256.pem

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIID49FDqcf1O1eO8saTgG70UbXQw9Fqwseliit2aWhH1oAoGCCqGSM49
3+
AwEHoUQDQgAEFglk2c+oVUIKQ64eZG9bhLNPWB7lSZ/ArK41eGy5wAzU/0G51Xtt
4+
CeBUl+MahZtn9fO1JKdF4qJmS39dXnpENg==
5+
-----END EC PRIVATE KEY-----

test/fixtures/pkey/rsa1024.pem

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIICXgIBAAKBgQDLwsSw1ECnPtT+PkOgHhcGA71nwC2/nL85VBGnRqDxOqjVh7Cx
3+
aKPERYHsk4BPCkE3brtThPWc9kjHEQQ7uf9Y1rbCz0layNqHyywQEVLFmp1cpIt/
4+
Q3geLv8ZD9pihowKJDyMDiN6ArYUmZczvW4976MU3+l54E6lF/JfFEU5hwIDAQAB
5+
AoGBAKSl/MQarye1yOysqX6P8fDFQt68VvtXkNmlSiKOGuzyho0M+UVSFcs6k1L0
6+
maDE25AMZUiGzuWHyaU55d7RXDgeskDMakD1v6ZejYtxJkSXbETOTLDwUWTn618T
7+
gnb17tU1jktUtU67xK/08i/XodlgnQhs6VoHTuCh3Hu77O6RAkEA7+gxqBuZR572
8+
74/akiW/SuXm0SXPEviyO1MuSRwtI87B02D0qgV8D1UHRm4AhMnJ8MCs1809kMQE
9+
JiQUCrp9mQJBANlt2ngBO14us6NnhuAseFDTBzCHXwUUu1YKHpMMmxpnGqaldGgX
10+
sOZB3lgJsT9VlGf3YGYdkLTNVbogQKlKpB8CQQDiSwkb4vyQfDe8/NpU5Not0fII
11+
8jsDUCb+opWUTMmfbxWRR3FBNu8wnym/m19N4fFj8LqYzHX4KY0oVPu6qvJxAkEA
12+
wa5snNekFcqONLIE4G5cosrIrb74sqL8GbGb+KuTAprzj5z1K8Bm0UW9lTjVDjDi
13+
qRYgZfZSL+x1P/54+xTFSwJAY1FxA/N3QPCXCjPh5YqFxAMQs2VVYTfg+t0MEcJD
14+
dPMQD5JX6g5HKnHFg2mZtoXQrWmJSn7p8GJK8yNTopEErA==
15+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)