Changeset 5131:57cb309489a3 in roaraudio for libroar


Ignore:
Timestamp:
09/06/11 15:07:18 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

Fixed segfaul in FLAC cf (Closes: #177)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/buffer.c

    r5111 r5131  
    5858 
    5959#define _ckbuf_free(m)  if ( buf == NULL || (m) ) { roar_err_set(ROAR_ERROR_FAULT); return -1; } 
    60 #define _ckbuf(m)  _ckbuf_free((m)); if ( _ckmem_corruption(buf) == -1 ) return -1; 
    61  
    62 static int inline _ckmem_corruption(struct roar_buffer * buf) { 
    63  int flags = buf->flags & (ROAR_BUFFER_FLAG_USEABLE|ROAR_BUFFER_FLAG_FREED); 
     60#define _ckbuf(m)       if ( _ckmem_corruption(buf, (m)) == -1 ) return -1; 
     61 
     62// if we use the 'inline' keyword here the program segfaults. why? 
     63static int _ckmem_corruption(volatile struct roar_buffer * buf, int m) { 
     64 int flags; 
     65 
     66 ROAR_DBG("_ckmem_corruption(buf=%p) = ?", buf); 
     67 
     68 // we need to recheck here, why? 
     69 // gcc changes the order of the above macros. why? 
     70 // this is a strange world. 
     71 if ( buf == NULL || m ) { 
     72  ROAR_DBG("_ckmem_corruption(buf=%p) = -1 // FAULT", buf); 
     73  roar_err_set(ROAR_ERROR_FAULT); 
     74  return -1; 
     75 } 
     76 
     77 ROAR_DBG("_ckmem_corruption(buf=%p) = ?", buf); 
     78 
     79 flags = buf->flags & (ROAR_BUFFER_FLAG_USEABLE|ROAR_BUFFER_FLAG_FREED); 
    6480 
    6581 ROAR_DBG("_ckmem_corruption(buf=%p{.flags=0x%.4x, ...} = ?", buf, buf->flags); 
     
    168184 } 
    169185 
    170  _ckmem_corruption(buf); 
     186 _ckmem_corruption(buf, 0); 
    171187 
    172188 ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf); 
     
    196212  ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf); 
    197213 
    198   _ckmem_corruption(cur); 
     214  _ckmem_corruption(cur, 0); 
    199215 
    200216  if ( roar_buffer_get_flag(cur, ROAR_BUFFER_FLAG_NOFREE) != 1 ) 
     
    370386  ROAR_DBG("roar_buffer_shift_out(*): todo=%u, cur=%p", (unsigned int) todo, cur); 
    371387 
    372   _ckmem_corruption(cur); 
     388  _ckmem_corruption(cur, 0); 
    373389 
    374390  if ( roar_buffer_get_len(cur, &cl) == -1 ) 
     
    570586 
    571587int roar_buffer_ring_stats (struct roar_buffer *  buf, struct roar_buffer_stats * stats) { 
    572  _ckbuf(0) 
     588 ROAR_DBG("roar_buffer_ring_stats(buf=%p, stats=%p) = ?", buf, stats); 
     589 
     590 _ckbuf(0) 
     591 
     592 ROAR_DBG("roar_buffer_ring_stats(buf=%p, stats=%p) = ?", buf, stats); 
    573593 
    574594 stats->parts        = 0; 
Note: See TracChangeset for help on using the changeset viewer.