카테고리 없음

OpenSSL segmentation fault, Core dump

acidpop 2017. 4. 5. 18:13
반응형

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 함수를 호출

 

 

 

구글링 검색이 잘 안되서 블로그에 기록 삼아 포스팅 해놓는다.

반응형