반응형
OpenSSL Library 를 사용하다 보니 segmentation fault 가 간혹 또는 자주 발생 하는 일이 생겼다.
core 파일을 trace 해봐도 답이 안나오는데.......
구글링을 해보니 Thread 에서 OpenSSL 을 사용하면 그럴수 있다라는 글들을 발견.
OpenSSL 은 Thread Safe 하지 않은가에 대해 또 다시 구글링.
답은 결국 OpenSSL 사이트에 있었다.
https://www.openssl.org/docs/man1.0.2/crypto/threads.html
OpenSSL 소스의 crypto/threads/mttest.c 해당 소스를 참고 하면 된다 하여 소스를 보니 뭔가 참 복잡하게 보이면서도 하나 하나 따져보면 굳이 복잡하지는 않다.
Linux 에서 사용한다면 다음과 같이 코드만 넣어주면 끝.
pthread_mutex_t *lock_cs; long *lock_count; void pthreads_locking_callback(int mode, int type, const char *file, int line) { #ifdef undef fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n", CRYPTO_thread_id(), (mode&CRYPTO_LOCK)?"l":"u", (type&CRYPTO_READ)?"r":"w",file,line); #endif /* if (CRYPTO_LOCK_SSL_CERT == type) fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n", CRYPTO_thread_id(), mode,file,line); */ if (mode & CRYPTO_LOCK) { pthread_mutex_lock(&(lock_cs[type])); lock_count[type]++; } else { pthread_mutex_unlock(&(lock_cs[type])); } } unsigned long pthreads_thread_id(void) { unsigned long ret; ret=(unsigned long)pthread_self(); return(ret); } void SSLThreadSetup(void) { int i; lock_cs=(pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); lock_count=(long *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); for (i=0; i<CRYPTO_num_locks(); i++) { lock_count[i]=0; pthread_mutex_init(&(lock_cs[i]),NULL); } CRYPTO_set_id_callback(pthreads_thread_id); CRYPTO_set_locking_callback(pthreads_locking_callback); } void SSLThreadCleanUp(void) { int i; CRYPTO_set_locking_callback(NULL); fprintf(stderr,"cleanup\n"); for (i=0; i<CRYPTO_num_locks(); i++) { pthread_mutex_destroy(&(lock_cs[i])); fprintf(stderr,"%8ld:%s\n",lock_count[i], CRYPTO_get_lock_name(i)); } OPENSSL_free(lock_cs); OPENSSL_free(lock_count); fprintf(stderr,"done cleanup\n"); } SSL 초기화 한 다음 SSLThreadSetup 함수 한번 호출 해주고 SSL 을 모두 사용 한 다음 해제 할떄에는 SSLThreadCleanUp 함수를 호출
구글링 검색이 잘 안되서 블로그에 기록 삼아 포스팅 해놓는다.
반응형