@ -931,13 +931,20 @@ void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f)
fr - > af . data = fr - > afdata ;
fr - > af . data = fr - > afdata ;
fr - > af . len = f - > len ;
fr - > af . len = f - > len ;
if ( fr - > af . datalen ) {
if ( fr - > af . datalen ) {
size_t copy_len = fr - > af . datalen ;
if ( copy_len > fr - > afdatalen ) {
ast_log ( LOG_ERROR , " Losing frame data because destination buffer size '%d' bytes not big enough for '%d' bytes in the frame \n " ,
( int ) fr - > afdatalen , ( int ) fr - > af . datalen ) ;
copy_len = fr - > afdatalen ;
}
# if __BYTE_ORDER == __LITTLE_ENDIAN
# if __BYTE_ORDER == __LITTLE_ENDIAN
/* We need to byte-swap slinear samples from network byte order */
/* We need to byte-swap slinear samples from network byte order */
if ( ( fr - > af . frametype = = AST_FRAME_VOICE ) & & ( fr - > af . subclass = = AST_FORMAT_SLINEAR ) ) {
if ( ( fr - > af . frametype = = AST_FRAME_VOICE ) & & ( fr - > af . subclass = = AST_FORMAT_SLINEAR ) ) {
ast_swapcopy_samples ( fr - > af . data , f - > data , fr - > af . samples ) ;
/* 2 bytes / sample for SLINEAR */
ast_swapcopy_samples ( fr - > af . data , f - > data , copy_len / 2 ) ;
} else
} else
# endif
# endif
memcpy ( fr - > af . data , f - > data , fr- > af . data len) ;
memcpy ( fr - > af . data , f - > data , copy_ len) ;
}
}
}
}
@ -951,11 +958,11 @@ struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheab
/* Attempt to get a frame from this thread's cache */
/* Attempt to get a frame from this thread's cache */
if ( ( iax_frames = ast_threadstorage_get ( & frame_cache , sizeof ( * iax_frames ) ) ) ) {
if ( ( iax_frames = ast_threadstorage_get ( & frame_cache , sizeof ( * iax_frames ) ) ) ) {
AST_LIST_TRAVERSE_SAFE_BEGIN ( iax_frames , fr , list ) {
AST_LIST_TRAVERSE_SAFE_BEGIN ( iax_frames , fr , list ) {
if ( fr - > mallocd_ datalen > = datalen ) {
if ( fr - > af datalen > = datalen ) {
size_t mallocd_datalen = fr - > mallocd_ datalen;
size_t afdatalen = fr - > af datalen;
AST_LIST_REMOVE_CURRENT ( iax_frames , list ) ;
AST_LIST_REMOVE_CURRENT ( iax_frames , list ) ;
memset ( fr , 0 , sizeof ( * fr ) ) ;
memset ( fr , 0 , sizeof ( * fr ) ) ;
fr - > mallocd_datalen = mallocd_ datalen;
fr - > afdatalen = af datalen;
break ;
break ;
}
}
}
}
@ -964,12 +971,12 @@ struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheab
if ( ! fr ) {
if ( ! fr ) {
if ( ! ( fr = ast_calloc_cache ( 1 , sizeof ( * fr ) + datalen ) ) )
if ( ! ( fr = ast_calloc_cache ( 1 , sizeof ( * fr ) + datalen ) ) )
return NULL ;
return NULL ;
fr - > mallocd_ datalen = datalen ;
fr - > af datalen = datalen ;
}
}
# else
# else
if ( ! ( fr = ast_calloc ( 1 , sizeof ( * fr ) + datalen ) ) )
if ( ! ( fr = ast_calloc ( 1 , sizeof ( * fr ) + datalen ) ) )
return NULL ;
return NULL ;
fr - > mallocd_ datalen = datalen ;
fr - > af datalen = datalen ;
# endif
# endif