summaryrefslogtreecommitdiffstats
path: root/bchannel.c
diff options
context:
space:
mode:
authorAndreas Eversberg2010-03-18 09:13:38 +0100
committerAndreas Eversberg2010-03-18 09:13:38 +0100
commite664caf22f8d83f9b4f42cc3b98ea0e55ab9b090 (patch)
tree10ada76d7d26113fd0c39b4f03e4dab81086bfbe /bchannel.c
parentAdded 'polling' option to options.conf. (diff)
downloadlcr-e664caf22f8d83f9b4f42cc3b98ea0e55ab9b090.tar.gz
lcr-e664caf22f8d83f9b4f42cc3b98ea0e55ab9b090.tar.xz
lcr-e664caf22f8d83f9b4f42cc3b98ea0e55ab9b090.zip
Fix NULL pointer audio frame problem.
The problem occurred when IAX protocol sends silence frame. Thanx to Peter for finding the problem and providing patch.
Diffstat (limited to 'bchannel.c')
-rw-r--r--bchannel.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/bchannel.c b/bchannel.c
index baa8434..5793795 100644
--- a/bchannel.c
+++ b/bchannel.c
@@ -418,26 +418,29 @@ void bchannel_transmit(struct bchannel *bchannel, unsigned char *data, int len)
return;
if (len > 1024 || len < 1)
return;
- switch(bchannel->b_mode) {
- case 0:
- for (i = 0; i < len; i++)
- *p++ = flip_bits[*data++];
- frm->prim = DL_DATA_REQ;
- break;
- case 1:
- for (i = 0; i < len; i++)
- *p++ = flip_bits[*data++];
- frm->prim = PH_DATA_REQ;
- break;
- case 2:
- memcpy(p, data, len);
- frm->prim = DL_DATA_REQ;
- break;
- case 3:
- memcpy(p, data, len);
- frm->prim = PH_DATA_REQ;
- break;
- }
+ if (data) {
+ switch(bchannel->b_mode) {
+ case 0:
+ for (i = 0; i < len; i++)
+ *p++ = flip_bits[*data++];
+ frm->prim = DL_DATA_REQ;
+ break;
+ case 1:
+ for (i = 0; i < len; i++)
+ *p++ = flip_bits[*data++];
+ frm->prim = PH_DATA_REQ;
+ break;
+ case 2:
+ memcpy(p, data, len);
+ frm->prim = DL_DATA_REQ;
+ break;
+ case 3:
+ memcpy(p, data, len);
+ frm->prim = PH_DATA_REQ;
+ break;
+ }
+ } else
+ memset(p, flip_bits[(options.law=='a')?0x2a:0xff], len);
frm->id = 0;
#ifdef SEAMLESS_TEST
unsigned char test_tone[8] = {0x2a, 0x24, 0xb4, 0x24, 0x2a, 0x25, 0xb5, 0x25};