Използвам библиотека openssl, за да отворя TLS връзка към някакъв сървър. Четейки документацията на библиотеката (да, някои хора все още четат документация и man страници) се натъкнах на изречението „SSL_libary_init() не е reentrant".
Разбирам най-общо казано какво е функция без повторно влизане: т.е. някаква функция, която поддържа вътрешно състояние по такъв начин, че извикването й два пъти по едно и също време или прекъсването й, докато се изпълнява, може да причини хаос (функцията не прави това, което очакват повикващите) .
Но в конкретния случай на SSL_library_init() се чудя какво всъщност означава.
означава ли, че ако възникне някакво прекъсване при извикване на SSL_library_init(), то няма да инициализира правилно SSL библиотеката? Следователно трябва ли да деактивирам всички достъпни прекъсвания, преди да го извикам, и да активирам отново необходимите след това?
означава ли това, че не е безопасен за нишка и че трябва да се уверя, че две нишки не могат да го извикат едновременно? (изглежда вероятно, дори ако безопасността на нишките не означава точно същото като reentrant).
означава ли, че не трябва да го извиквам два пъти през живота на програмата, или че извикването му, докато SSL връзките са отворени, ще предизвика хаос?
ТЪЙ КАТО работя върху прокси, като единият край е клиент, а другият е сървър, и двата края биха могли потенциално да използват TLS услуги (но аз също мога да бъда само един край или нито един). Трябва ли да управлявам SSL библиотека като сингълтон за цялата система? Ако случаят е такъв, той е достатъчно лесен за управление, но не е точно проблем с повторното влизане, както разбирам думата.
Не знам кратката дума за функция, която трябва да се извика само веднъж...
Аз също имам подобен въпрос за SSL_CTX_new(). В документацията се посочва, че трябва да се извиква само веднъж за живота на програмата. Това е досадно, тъй като изглежда ограничава както сървъра, така и клиента (или няколко независими сървърни или клиентски екземпляра, работещи в един и същ процес) да използват един и същ SSL_METHOD и не се чувства правилно, но все пак се надявам в този случай да е просто някаква неточност в документацията .
Някой има ли достатъчно опит с openSSL, за да обясни какво трябва или не трябва да правя с кода за инициализиране на OpenSSL, за да остана на сигурно място?
main
и да приключите с нея (така че да не се интересувате от безопасността на нишките или възможността за повторно влизане!).SSL_CTX_new
също звучи така, сякаш инициализира глобални променливи, така че извикването му многократно не постига нищо (освен може би изтичане на памет). Отново, не знам SSL, така че всичко това са само предположения. - person Shahbaz   schedule 28.03.2013SSL_CTX *
, подозирам, че е добре, ако го извикате няколко пъти; Ще получите множество контексти. Казва се веднъж за живот на програмата, вероятно защото не са подозирали, че някой би искал да има множество контексти в една и съща програма, така че казват, че един е достатъчен (не че повече е вредно). Може да получите по-добра представа, ако попитате в техния пощенски списък (ако имат такъв) или погледнете изходния код. - person Shahbaz   schedule 29.03.2013