diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bitwise.c | 63 | ||||
-rw-r--r-- | src/framing.c | 47 |
2 files changed, 83 insertions, 27 deletions
diff --git a/src/bitwise.c b/src/bitwise.c index 380119e..25cf862 100644 --- a/src/bitwise.c +++ b/src/bitwise.c @@ -47,28 +47,48 @@ void oggpackB_writeinit(oggpack_buffer *b){ oggpack_writeinit(b); } +int oggpack_writecheck(oggpack_buffer *b){ + if(!b->ptr || !b->storage)return -1; + return 0; +} + +int oggpackB_writecheck(oggpack_buffer *b){ + return oggpackB_writecheck(b); +} + void oggpack_writetrunc(oggpack_buffer *b,long bits){ long bytes=bits>>3; - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask[bits]; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask[bits]; + } } void oggpackB_writetrunc(oggpack_buffer *b,long bits){ long bytes=bits>>3; - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask8B[bits]; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask8B[bits]; + } } /* Takes only up to 32 bits. */ void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ if(b->endbyte+4>=b->storage){ - b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + void *ret; + if(!b->ptr)return; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret){ + oggpack_writeclear(b); + return; + } + b->buffer=ret; b->storage+=BUFFER_INCREMENT; b->ptr=b->buffer+b->endbyte; } @@ -102,7 +122,14 @@ void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ /* Takes only up to 32 bits. */ void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ if(b->endbyte+4>=b->storage){ - b->buffer=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + void *ret; + if(!b->ptr)return; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret){ + oggpack_writeclear(b); + return; + } + b->buffer=ret; b->storage+=BUFFER_INCREMENT; b->ptr=b->buffer+b->endbyte; } @@ -165,8 +192,15 @@ static void oggpack_writecopy_helper(oggpack_buffer *b, }else{ /* aligned block copy */ if(b->endbyte+bytes+1>=b->storage){ + void *ret; + if(!b->ptr)return; b->storage=b->endbyte+bytes+BUFFER_INCREMENT; - b->buffer=_ogg_realloc(b->buffer,b->storage); + ret=_ogg_realloc(b->buffer,b->storage); + if(!ret){ + oggpack_writeclear(b); + return; + } + b->buffer=ret; b->ptr=b->buffer+b->endbyte; } @@ -193,6 +227,7 @@ void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ } void oggpack_reset(oggpack_buffer *b){ + if(!b->ptr)return; b->ptr=b->buffer; b->buffer[0]=0; b->endbit=b->endbyte=0; @@ -203,7 +238,7 @@ void oggpackB_reset(oggpack_buffer *b){ } void oggpack_writeclear(oggpack_buffer *b){ - _ogg_free(b->buffer); + if(b->buffer)_ogg_free(b->buffer); memset(b,0,sizeof(*b)); } diff --git a/src/framing.c b/src/framing.c index 59049f0..d202d62 100644 --- a/src/framing.c +++ b/src/framing.c @@ -189,12 +189,17 @@ int ogg_stream_init(ogg_stream_state *os,int serialno){ if(os){ memset(os,0,sizeof(*os)); os->body_storage=16*1024; - os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); - os->lacing_storage=1024; + + os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); os->lacing_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); os->granule_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); + if(!os->body_data || !os->lacing_vals || !os->granule_vals){ + ogg_stream_clear(os); + return -1; + } + os->serialno=serialno; return(0); @@ -225,19 +230,32 @@ int ogg_stream_destroy(ogg_stream_state *os){ /* Helpers for ogg_stream_encode; this keeps the structure and what's happening fairly clear */ -static void _os_body_expand(ogg_stream_state *os,int needed){ +static int _os_body_expand(ogg_stream_state *os,int needed){ if(os->body_storage<=os->body_fill+needed){ + void *ret; + ret=_ogg_realloc(os->body_data,(os->body_storage+needed+1024)* + sizeof(*os->body_data)); + if(!ret) return -1; os->body_storage+=(needed+1024); - os->body_data=_ogg_realloc(os->body_data,os->body_storage*sizeof(*os->body_data)); + os->body_data=ret; } + return 0; } -static void _os_lacing_expand(ogg_stream_state *os,int needed){ +static int _os_lacing_expand(ogg_stream_state *os,int needed){ if(os->lacing_storage<=os->lacing_fill+needed){ + void *ret; + ret=_ogg_realloc(os->lacing_vals,(os->lacing_storage+needed+32)* + sizeof(*os->lacing_vals)); + if(!ret)return -1; + os->lacing_vals=ret; + ret=_ogg_realloc(os->granule_vals,(os->lacing_storage+needed+32)* + sizeof(*os->granule_vals)); + if(!ret)return -1; + os->granule_vals=ret; os->lacing_storage+=(needed+32); - os->lacing_vals=_ogg_realloc(os->lacing_vals,os->lacing_storage*sizeof(*os->lacing_vals)); - os->granule_vals=_ogg_realloc(os->granule_vals,os->lacing_storage*sizeof(*os->granule_vals)); } + return 0; } /* checksum the page */ @@ -288,8 +306,8 @@ int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, } /* make sure we have the buffer storage */ - _os_body_expand(os,bytes); - _os_lacing_expand(os,lacing_vals); + if(_os_body_expand(os,bytes))return -1; + if(_os_lacing_expand(os,lacing_vals))return -1; /* Copy in the submitted packet. Yes, the copy is a waste; this is the liability of overly clean abstraction for the time being. It @@ -528,11 +546,14 @@ char *ogg_sync_buffer(ogg_sync_state *oy, long size){ if(size>oy->storage-oy->fill){ /* We need to extend the internal buffer */ long newsize=size+oy->fill+4096; /* an extra page to be nice */ + void *ret; if(oy->data) - oy->data=_ogg_realloc(oy->data,newsize); + ret=_ogg_realloc(oy->data,newsize); else - oy->data=_ogg_malloc(newsize); + ret=_ogg_malloc(newsize); + if(!ret)return NULL; + oy->data=ret; oy->storage=newsize; } @@ -729,7 +750,7 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ if(serialno!=os->serialno)return(-1); if(version>0)return(-1); - _os_lacing_expand(os,segments+1); + if(_os_lacing_expand(os,segments+1))return -1; /* are we in sequence? */ if(pageno!=os->pageno){ @@ -766,7 +787,7 @@ int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ } if(bodysize){ - _os_body_expand(os,bodysize); + if(_os_body_expand(os,bodysize))return -1; memcpy(os->body_data+os->body_fill,body,bodysize); os->body_fill+=bodysize; } |