Changeset 5438:4eb05969f66c in roaraudio for libroar/plugincontainer.c


Ignore:
Timestamp:
03/20/12 17:00:08 (10 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

fix code so refcount is correct and avoid double free

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/plugincontainer.c

    r5436 r5438  
    5757 
    5858static void * _copy_kv(struct roar_keyval ** copy, struct roar_keyval * src, size_t len) { 
    59  size_t buflen, i; 
     59 size_t buflen = 0; 
     60 size_t i; 
    6061 void * ret; 
    6162 char * p; 
    6263 struct roar_keyval * c; 
    6364 
    64  buflen = len * (sizeof(struct roar_keyval) + 2 /* terminating \0s */); 
    65  
    6665 for (i = 0; i < len; i++) { 
    6766  if ( src[i].key != NULL ) 
    68    buflen += roar_mm_strlen(src[i].key); 
     67   buflen += roar_mm_strlen(src[i].key) + 1; 
    6968  if ( src[i].value != NULL ) 
    70    buflen += roar_mm_strlen(src[i].value); 
    71  } 
     69   buflen += roar_mm_strlen(src[i].value) + 1; 
     70 } 
     71 
     72 c   = roar_mm_malloc(len * sizeof(struct roar_keyval)); 
     73 if ( c == NULL ) 
     74  return NULL; 
     75 
     76 memset(c, 0, len * sizeof(struct roar_keyval)); 
    7277 
    7378 ret = roar_mm_malloc(buflen); 
     
    7782 memset(ret, 0, buflen); 
    7883 
    79  c = ret; 
    80  p = ret + len*sizeof(struct roar_keyval); 
     84 p = ret; 
    8185 
    8286 for (i = 0; i < len; i++) { 
     
    178182int roar_plugincontainer_ref(struct roar_plugincontainer * cont) { 
    179183 if ( cont == NULL ) { 
     184  ROAR_DBG("roar_plugincontainer_ref(cont=%p) = -1 // error=FAULT", cont); 
    180185  roar_err_set(ROAR_ERROR_FAULT); 
    181186  return -1; 
     
    184189 cont->refc++; 
    185190 
     191 ROAR_DBG("roar_plugincontainer_ref(cont=%p) = 0", cont); 
    186192 return 0; 
    187193} 
     
    191197 
    192198 if ( cont == NULL ) { 
     199  ROAR_DBG("roar_plugincontainer_unref(cont=%p) = -1 // error=FAULT", cont); 
    193200  roar_err_set(ROAR_ERROR_FAULT); 
    194201  return -1; 
     
    197204 cont->refc--; 
    198205 
    199  if ( cont->refc ) 
     206 if ( cont->refc ) { 
     207  ROAR_DBG("roar_plugincontainer_unref(cont=%p) = 0", cont); 
    200208  return 0; 
     209 } 
    201210 
    202211 while (cont->numhandles) { 
     
    220229 roar_mm_free(cont); 
    221230 
     231 ROAR_DBG("roar_plugincontainer_unref(cont=%p) = 0", cont); 
    222232 return 0; 
    223233} 
Note: See TracChangeset for help on using the changeset viewer.