aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-07-17 21:09:53 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-07-17 21:09:53 +0000
commit08ecdbbb797ccfdf008cc8f3eba1e4dcc7440722 (patch)
tree82b5a3de27692fd979b5df6bdbca42d1277fca6a
parentb43afa088bd30ee60e1cf6d3873b76b96b3bc6d9 (diff)
parent1990a0ca95b2ee02fd5eabafeba1e4931881c542 (diff)
Creating tag for the release of asterisk-1.2.22-netsec
git-svn-id: http://svn.digium.com/svn/asterisk/tags/1.2.22-netsec@75464 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_iax2.c8
-rw-r--r--channels/chan_skinny.c2
-rw-r--r--channels/iax2-parser.c12
-rw-r--r--channels/iax2-parser.h2
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 */
};