diff options
Diffstat (limited to 'pjmedia/src/pjmedia/transport_srtp.c')
-rw-r--r-- | pjmedia/src/pjmedia/transport_srtp.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c index 708aa77d..a3378923 100644 --- a/pjmedia/src/pjmedia/transport_srtp.c +++ b/pjmedia/src/pjmedia/transport_srtp.c @@ -260,6 +260,8 @@ const char* get_libsrtp_errstr(int err) #endif } +static void pjmedia_srtp_deinit_lib(void); + static pj_status_t pjmedia_srtp_init_lib(void) { static pj_bool_t initialized = PJ_FALSE; @@ -273,12 +275,32 @@ static pj_status_t pjmedia_srtp_init_lib(void) return PJMEDIA_ERRNO_FROM_LIBSRTP(err); } + if (pj_atexit(pjmedia_srtp_deinit_lib) != PJ_SUCCESS) { + /* There will be memory leak when it fails to schedule libsrtp + * deinitialization, however the memory leak could be harmless, + * since in modern OS's memory used by an application is released + * when the application terminates. + */ + PJ_LOG(4, (THIS_FILE, "Failed to register libsrtp deinit.")); + } + initialized = PJ_TRUE; } return PJ_SUCCESS; } +static void pjmedia_srtp_deinit_lib(void) +{ + err_status_t err; + + err = srtp_deinit(); + if (err != err_status_ok) { + PJ_LOG(4, (THIS_FILE, "Failed to deinitialize libsrtp: %s", + get_libsrtp_errstr(err))); + } +} + static int get_crypto_idx(const pj_str_t* crypto_name) { int i; |