Skip to content
Snippets Groups Projects
0070-os_core_unix-Set-mutex-NULL-in-atomic-destroy-and-ad.patch 3.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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