diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-17 21:09:39 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-07-17 21:09:39 +0000 |
commit | 1990a0ca95b2ee02fd5eabafeba1e4931881c542 (patch) | |
tree | 82b5a3de27692fd979b5df6bdbca42d1277fca6a | |
parent | 9faaebb6aae624c7367c878b2a72755fc22999d8 (diff) |
get branch up to date to include ASA fixes
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2-netsec@75462 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_iax2.c | 8 | ||||
-rw-r--r-- | channels/chan_skinny.c | 2 | ||||
-rw-r--r-- | channels/iax2-parser.c | 12 | ||||
-rw-r--r-- | channels/iax2-parser.h | 2 |
4 files changed, 19 insertions, 5 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 5bc629fa3..dacc20e17 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -4020,7 +4020,9 @@ static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned in int sendmini=0; unsigned int lastsent; unsigned int fts; - + + frb.fr2.afdatalen = sizeof(frb.buffer); + if (!pvt) { ast_log(LOG_WARNING, "No private structure for packet?\n"); return -1; @@ -6435,7 +6437,8 @@ static int socket_read(int *id, int fd, short events, void *cbdata) /* allocate an iax_frame with 4096 bytes of data buffer */ fr = alloca(sizeof(*fr) + 4096); fr->callno = 0; - + fr->afdatalen = 4096; /* From alloca() above */ + res = recvfrom(fd, buf, sizeof(buf), 0,(struct sockaddr *) &sin, &len); if (res < 0) { if (errno != ECONNREFUSED) @@ -6811,6 +6814,7 @@ static int socket_read(int *id, int fd, short events, void *cbdata) return 1; } f.data = NULL; + f.datalen = 0; } else f.data = buf + sizeof(*fh); } else { diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index 3cfd9d646..c9d3f8854 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -2862,7 +2862,7 @@ static int get_input(struct skinnysession *s) return -1; } dlen = letohl(*(int *)s->inbuf); - if (dlen < 0) { + if (dlen < 4) { ast_log(LOG_WARNING, "Skinny Client sent invalid data.\n"); return -1; } diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c index 3ef80a39c..6db037455 100644 --- a/channels/iax2-parser.c +++ b/channels/iax2-parser.c @@ -904,13 +904,20 @@ void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f) fr->af.delivery.tv_usec = 0; fr->af.data = fr->afdata; 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); } } @@ -919,6 +926,7 @@ struct iax_frame *iax_frame_new(int direction, int datalen) struct iax_frame *fr; fr = malloc((int)sizeof(struct iax_frame) + datalen); if (fr) { + fr->afdatalen = datalen; fr->direction = direction; fr->retrans = -1; frames++; diff --git a/channels/iax2-parser.h b/channels/iax2-parser.h index dd90682c2..50e04538e 100644 --- a/channels/iax2-parser.h +++ b/channels/iax2-parser.h @@ -119,6 +119,8 @@ struct iax_frame { struct iax_frame *prev; /* Actual, isolated frame header */ struct ast_frame af; + /* Amount of data _allocated_ for afdata */ + size_t afdatalen; unsigned char unused[AST_FRIENDLY_OFFSET]; unsigned char afdata[0]; /* Data for frame */ }; |