summaryrefslogtreecommitdiff
path: root/third-party/pjproject
diff options
context:
space:
mode:
authorGeorge Joseph <gjoseph@digium.com>2018-03-25 12:12:39 -0600
committerGeorge Joseph <gjoseph@digium.com>2018-03-28 10:32:15 -0600
commita87141ddfd184ab5a00df2d36ea586cc067c6479 (patch)
tree382da3856fe4d2763a6ef735cf384d8d699845e4 /third-party/pjproject
parenta4a5b8d562b0e0f10024f7dcbfaf2cb740e81d15 (diff)
pjproject_bundled: Add patch for pj_atomic crashes
There have been some crashes in the past where something attempts to use a pj_atomic after it's already been destroyed. This patch tries to prevent it by making sure that pj_atomic_destroy sets its mutex to NULL when it's done. The pj_mutex functions already check for a NULL mutex and just return PJ_EINVAL. Teluu also added some checks to the win32 implementation as well. Change-Id: Id25f70b79fdedf44ead6e6e1763a4417d3b3f825
Diffstat (limited to 'third-party/pjproject')
-rw-r--r--third-party/pjproject/patches/0070-os_core_unix-Set-mutex-NULL-in-atomic-destroy-and-ad.patch114
1 files changed, 114 insertions, 0 deletions
diff --git a/third-party/pjproject/patches/0070-os_core_unix-Set-mutex-NULL-in-atomic-destroy-and-ad.patch b/third-party/pjproject/patches/0070-os_core_unix-Set-mutex-NULL-in-atomic-destroy-and-ad.patch
new file mode 100644
index 000000000..3aafd69e8
--- /dev/null
+++ b/third-party/pjproject/patches/0070-os_core_unix-Set-mutex-NULL-in-atomic-destroy-and-ad.patch
@@ -0,0 +1,114 @@
+From 67485f3a6c711f67a40ff46288cb6be1658023bd Mon Sep 17 00:00:00 2001
+From: nanang <nanang@localhost>
+Date: Mon, 26 Mar 2018 10:33:50 +0000
+Subject: [PATCH] Close #2101: - set atomic's mutex to NULL in atomic destroy
+ - added few sanity checks to the atomic functions.
+
+---
+ pjlib/src/pj/os_core_unix.c | 20 ++++++++++++++++++--
+ pjlib/src/pj/os_core_win32.c | 4 ++++
+ 2 files changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/pjlib/src/pj/os_core_unix.c b/pjlib/src/pj/os_core_unix.c
+index ebfe84348..c17ad4ef0 100644
+--- a/pjlib/src/pj/os_core_unix.c
++++ b/pjlib/src/pj/os_core_unix.c
+@@ -879,9 +879,16 @@ PJ_DEF(pj_status_t) pj_atomic_create( pj_pool_t *pool,
+ */
+ PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *atomic_var )
+ {
++ pj_status_t status;
++
+ PJ_ASSERT_RETURN(atomic_var, PJ_EINVAL);
++
+ #if PJ_HAS_THREADS
+- return pj_mutex_destroy( atomic_var->mutex );
++ status = pj_mutex_destroy( atomic_var->mutex );
++ if (status == PJ_SUCCESS) {
++ atomic_var->mutex = NULL;
++ }
++ return status;
+ #else
+ return 0;
+ #endif
+@@ -892,10 +899,16 @@ PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *atomic_var )
+ */
+ PJ_DEF(void) pj_atomic_set(pj_atomic_t *atomic_var, pj_atomic_value_t value)
+ {
++ pj_status_t status;
++
+ PJ_CHECK_STACK();
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+
+ #if PJ_HAS_THREADS
+- pj_mutex_lock( atomic_var->mutex );
++ status = pj_mutex_lock( atomic_var->mutex );
++ if (status != PJ_SUCCESS) {
++ return;
++ }
+ #endif
+ atomic_var->value = value;
+ #if PJ_HAS_THREADS
+@@ -946,6 +959,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_inc_and_get(pj_atomic_t *atomic_var)
+ */
+ PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var)
+ {
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+ pj_atomic_inc_and_get(atomic_var);
+ }
+
+@@ -974,6 +988,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_dec_and_get(pj_atomic_t *atomic_var)
+ */
+ PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var)
+ {
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+ pj_atomic_dec_and_get(atomic_var);
+ }
+
+@@ -1005,6 +1020,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_add_and_get( pj_atomic_t *atomic_var,
+ PJ_DEF(void) pj_atomic_add( pj_atomic_t *atomic_var,
+ pj_atomic_value_t value )
+ {
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+ pj_atomic_add_and_get(atomic_var, value);
+ }
+
+diff --git a/pjlib/src/pj/os_core_win32.c b/pjlib/src/pj/os_core_win32.c
+index 1cb6004d3..8c934b34d 100644
+--- a/pjlib/src/pj/os_core_win32.c
++++ b/pjlib/src/pj/os_core_win32.c
+@@ -750,6 +750,7 @@ PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *var )
+ PJ_DEF(void) pj_atomic_set( pj_atomic_t *atomic_var, pj_atomic_value_t value)
+ {
+ PJ_CHECK_STACK();
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+
+ InterlockedExchange(&atomic_var->value, value);
+ }
+@@ -784,6 +785,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_inc_and_get(pj_atomic_t *atomic_var)
+ */
+ PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var)
+ {
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+ pj_atomic_inc_and_get(atomic_var);
+ }
+
+@@ -806,6 +808,7 @@ PJ_DEF(pj_atomic_value_t) pj_atomic_dec_and_get(pj_atomic_t *atomic_var)
+ */
+ PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var)
+ {
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+ pj_atomic_dec_and_get(atomic_var);
+ }
+
+@@ -815,6 +818,7 @@ PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var)
+ PJ_DEF(void) pj_atomic_add( pj_atomic_t *atomic_var,
+ pj_atomic_value_t value )
+ {
++ PJ_ASSERT_ON_FAIL(atomic_var, return);
+ #if defined(PJ_WIN32_WINNT) && PJ_WIN32_WINNT >= 0x0400
+ InterlockedExchangeAdd( &atomic_var->value, value );
+ #else
+--
+2.14.3
+