Summary: | SIGSEGV при запуске 'openssl ca' | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Vladimir Lettiev <crux> |
Component: | openssl | Assignee: | Gleb F-Malinovskiy <glebfm> |
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P2 | CC: | glebfm |
Version: | unstable | ||
Hardware: | all | ||
OS: | Linux |
Description
Vladimir Lettiev
2004-10-05 23:40:37 MSD
Сделаю ещё несколько уточнений. Вот сообщения от gdb: [crux@host1 crux]$ gdb --args openssl ca .... (gdb) run Starting program: /usr/bin/openssl ca Error while mapping shared library sections: : Success. Error while reading shared library symbols: : No such file or directory. (no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...(no debugging symbols found)...Error while reading shared library symbols: : No such file or directory. Error while reading shared library symbols: : No such file or directory. Using configuration from /var/lib/ssl/openssl.cnf Error opening CA private key ./demoCA/private/cakey.pem 31882:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=unique_subject 31882:error:02001002:system library:fopen:No such file or directory:bss_file.c:276:fopen('./demoCA/private/cakey.pem','r') 31882:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:278: unable to load CA private key Program received signal SIGSEGV, Segmentation fault. 0x0807bdda in password_callback () (gdb) where #0 0x0807bdda in password_callback () #1 0x0805fe76 in ?? () #2 0x00000000 in ?? () Т.о. SIGSEGV получаем в функции password_callback(). Дальше я попробовал проанализировать эту фунцию и вывод strace, в итоге пришёл к заключению (может я и не прав кончено): в password_callback() есть код: if (password) { res = strlen(password); if (res > bufsiz) res = bufsiz; memcpy(buf, password, res); return res; } При этом функция не проверяет равна ли buf NULL. Судя по выводу strace там как раз такое и происходит: mmap2(NULL, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40266000 Если я прав, то получается, что все приложения завязанные на libssl могут сегфолтится при определённых условиях? GDB увёл меня в совершенно левую сторону... Следующий патч лечит данный сегфолт (проверено): --- openssl-0.9.7d-orig/apps/ca.c 2004-03-08 16:07:07 +0300 +++ openssl-0.9.7d/apps/ca.c 2004-10-09 10:05:38 +0400 @@ -1503,7 +1503,8 @@ if (free_key && key) OPENSSL_free(key); BN_free(serial); - free_index(db); + if (db != NULL) + free_index(db); EVP_PKEY_free(pkey); X509_free(x509); X509_CRL_free(crl); Проблема в том, что перед вызовом функции OPENSSL_free() (ака CRYPTO_free) требуется проверить параметр на значение NULL иначе сегфолт неизбежен. Посмотрев исходники прораммы часто можно увидеть такие виды вызовов: if (a) OPENSSL_free(a); if (a != NULL) OPENSSL_free(a); но ещё чаще таких проверок не делается (как и в случае, описанном выше). In openssl-0.9.7g, free_index() checks its arguments and handles NULL properly. |