diff options
Diffstat (limited to 'channels/iax2-parser.c')
-rw-r--r-- | channels/iax2-parser.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c index 7947c7fc3..769505193 100644 --- a/channels/iax2-parser.c +++ b/channels/iax2-parser.c @@ -974,13 +974,20 @@ void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f) fr->af.data = fr->afdata; fr->af.len = f->len; 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 /* We need to byte-swap slinear samples from network byte order */ 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 #endif - memcpy(fr->af.data, f->data, fr->af.datalen); + memcpy(fr->af.data, f->data, copy_len); } } @@ -994,11 +1001,11 @@ struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheab /* Attempt to get a frame from this thread's cache */ if ((iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) { AST_LIST_TRAVERSE_SAFE_BEGIN(iax_frames, fr, list) { - if (fr->mallocd_datalen >= datalen) { - size_t mallocd_datalen = fr->mallocd_datalen; + if (fr->afdatalen >= datalen) { + size_t afdatalen = fr->afdatalen; AST_LIST_REMOVE_CURRENT(iax_frames, list); memset(fr, 0, sizeof(*fr)); - fr->mallocd_datalen = mallocd_datalen; + fr->afdatalen = afdatalen; break; } } @@ -1007,12 +1014,12 @@ struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheab if (!fr) { if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen))) return NULL; - fr->mallocd_datalen = datalen; + fr->afdatalen = datalen; } #else if (!(fr = ast_calloc(1, sizeof(*fr) + datalen))) return NULL; - fr->mallocd_datalen = datalen; + fr->afdatalen = datalen; #endif |