diff options
Diffstat (limited to 'lib/base/heimbase.c')
| -rw-r--r-- | lib/base/heimbase.c | 22 | 
1 files changed, 15 insertions, 7 deletions
| diff --git a/lib/base/heimbase.c b/lib/base/heimbase.c index 6ad6ab258f09..9a1120b68368 100644 --- a/lib/base/heimbase.c +++ b/lib/base/heimbase.c @@ -86,11 +86,12 @@ struct heim_auto_release {  void *  heim_retain(void *ptr)  { -    struct heim_base *p = PTR2BASE(ptr); +    struct heim_base *p;      if (ptr == NULL || heim_base_is_tagged(ptr))  	return ptr; +    p = PTR2BASE(ptr);      if (p->ref_cnt == heim_base_atomic_max)  	return ptr; @@ -109,11 +110,12 @@ void  heim_release(void *ptr)  {      heim_base_atomic_type old; -    struct heim_base *p = PTR2BASE(ptr); +    struct heim_base *p;      if (ptr == NULL || heim_base_is_tagged(ptr))  	return; +    p = PTR2BASE(ptr);      if (p->ref_cnt == heim_base_atomic_max)  	return; @@ -256,9 +258,12 @@ heim_cmp(heim_object_t a, heim_object_t b)  static void  memory_dealloc(void *ptr)  { -    struct heim_base_mem *p = (struct heim_base_mem *)PTR2BASE(ptr); -    if (p->dealloc) -	p->dealloc(ptr); +    if (ptr) { +        struct heim_base_mem *p = (struct heim_base_mem *)PTR2BASE(ptr); + +        if (p->dealloc) +            p->dealloc(ptr); +    }  }  struct heim_type_data memory_object = { @@ -666,13 +671,16 @@ heim_auto_release_create(void)  heim_object_t  heim_auto_release(heim_object_t ptr)  { -    struct heim_base *p = PTR2BASE(ptr); -    struct ar_tls *tls = autorel_tls(); +    struct heim_base *p; +    struct ar_tls *tls;      heim_auto_release_t ar;      if (ptr == NULL || heim_base_is_tagged(ptr))  	return ptr; +    p = PTR2BASE(ptr); +    tls = autorel_tls(); +      /* drop from old pool */      if ((ar = p->autorelpool) != NULL) {  	HEIMDAL_MUTEX_lock(&ar->pool_mutex); | 
