summaryrefslogtreecommitdiff
path: root/kernel/zaptel-base.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2008-04-17 12:20:26 +0000
committerkpfleming <kpfleming@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2008-04-17 12:20:26 +0000
commite411b712754d9a6851c4da030bfbe41aab5c61e7 (patch)
tree23466e84f75df8df52fedef7f3d4e7be2cfe3af0 /kernel/zaptel-base.c
parent66bfdde48464695309f4bb01c59b9a9417ef72e5 (diff)
when processing ZT_SET_DIALPARAMS, don't return an error for out-of-range tone durations, just ignore them (so that applications that don't initialize the entire zt_dialparams structure won't fail to set the ones they do initialize)
(closes issue #12456) Reported by: fnordian Tested by: fnordian git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.4@4173 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'kernel/zaptel-base.c')
-rw-r--r--kernel/zaptel-base.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/kernel/zaptel-base.c b/kernel/zaptel-base.c
index bceeb43..af068ef 100644
--- a/kernel/zaptel-base.c
+++ b/kernel/zaptel-base.c
@@ -3916,14 +3916,16 @@ static int zt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cmd
case ZT_SET_DIALPARAMS:
if (copy_from_user(&tdp, (struct zt_dialparams *) data, sizeof(tdp)))
return -EFAULT;
- if ((tdp.dtmf_tonelen > 4000) || (tdp.dtmf_tonelen < 10))
- return -EINVAL;
- if ((tdp.mfv1_tonelen > 4000) || (tdp.mfv1_tonelen < 10))
- return -EINVAL;
- if ((tdp.mfr2_tonelen > 4000) || (tdp.mfr2_tonelen < 10))
- return -EINVAL;
- global_dialparams = tdp;
+ if ((tdp.dtmf_tonelen <= 4000) || (tdp.dtmf_tonelen >= 10)) {
+ global_dialparams.dtmf_tonelen = tdp.dtmf_tonelen;
+ }
+ if ((tdp.mfv1_tonelen <= 4000) || (tdp.mfv1_tonelen >= 10)) {
+ global_dialparams.mfv1_tonelen = tdp.mfv1_tonelen;
+ }
+ if ((tdp.mfr2_tonelen <= 4000) || (tdp.mfr2_tonelen >= 10)) {
+ global_dialparams.mfr2_tonelen = tdp.mfr2_tonelen;
+ }
/* update the lengths in all currently loaded zones */
write_lock(&zone_lock);
@@ -3934,27 +3936,27 @@ static int zt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cmd
continue;
for (i = 0; i < sizeof(z->dtmf) / sizeof(z->dtmf[0]); i++) {
- z->dtmf[i].tonesamples = tdp.dtmf_tonelen * ZT_CHUNKSIZE;
+ z->dtmf[i].tonesamples = global_dialparams.dtmf_tonelen * ZT_CHUNKSIZE;
}
/* for MFR1, we only adjust the length of the digits */
for (i = ZT_TONE_MFR1_0; i <= ZT_TONE_MFR1_9; i++) {
- z->mfr1[i - ZT_TONE_MFR1_BASE].tonesamples = tdp.mfv1_tonelen * ZT_CHUNKSIZE;
+ z->mfr1[i - ZT_TONE_MFR1_BASE].tonesamples = global_dialparams.mfv1_tonelen * ZT_CHUNKSIZE;
}
for (i = 0; i < sizeof(z->mfr2_fwd) / sizeof(z->mfr2_fwd[0]); i++) {
- z->mfr2_fwd[i].tonesamples = tdp.mfr2_tonelen * ZT_CHUNKSIZE;
+ z->mfr2_fwd[i].tonesamples = global_dialparams.mfr2_tonelen * ZT_CHUNKSIZE;
}
for (i = 0; i < sizeof(z->mfr2_rev) / sizeof(z->mfr2_rev[0]); i++) {
- z->mfr2_rev[i].tonesamples = tdp.mfr2_tonelen * ZT_CHUNKSIZE;
+ z->mfr2_rev[i].tonesamples = global_dialparams.mfr2_tonelen * ZT_CHUNKSIZE;
}
}
write_unlock(&zone_lock);
- dtmf_silence.tonesamples = tdp.dtmf_tonelen * ZT_CHUNKSIZE;
- mfr1_silence.tonesamples = tdp.mfv1_tonelen * ZT_CHUNKSIZE;
- mfr2_silence.tonesamples = tdp.mfr2_tonelen * ZT_CHUNKSIZE;
+ dtmf_silence.tonesamples = global_dialparams.dtmf_tonelen * ZT_CHUNKSIZE;
+ mfr1_silence.tonesamples = global_dialparams.mfv1_tonelen * ZT_CHUNKSIZE;
+ mfr2_silence.tonesamples = global_dialparams.mfr2_tonelen * ZT_CHUNKSIZE;
break;
case ZT_GET_DIALPARAMS: