]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
get branch up to date to include ASA fixes
authorRussell Bryant <russell@russellbryant.com>
Tue, 17 Jul 2007 21:09:39 +0000 (21:09 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 17 Jul 2007 21:09:39 +0000 (21:09 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@75462 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_iax2.c
channels/chan_skinny.c
channels/iax2-parser.c
channels/iax2-parser.h

index 5bc629fa35d07faa689fee06a0777cb64ea13cc7..dacc20e17c78b4bc924175340c88614e5a18e94a 100644 (file)
@@ -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 {
index 3cfd9d64687daf56d4ae74c882653327325a1a97..c9d3f885487781d60a3e6d81ec2e9d71e3f4c29b 100644 (file)
@@ -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;
                }
index 3ef80a39c3c4387be161b4439020c892d3fc05c9..6db037455b967771c7d3f52331e177a4c3b327f7 100644 (file)
@@ -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++;
index dd90682c2c8cebeba975394d997bf246a8e57f2b..50e04538e2ac42c7bd13221443783cb22667cbfe 100644 (file)
@@ -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 */
 };