diff options
author | kpfleming <kpfleming@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2008-04-17 12:20:26 +0000 |
---|---|---|
committer | kpfleming <kpfleming@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2008-04-17 12:20:26 +0000 |
commit | e411b712754d9a6851c4da030bfbe41aab5c61e7 (patch) | |
tree | 23466e84f75df8df52fedef7f3d4e7be2cfe3af0 /kernel/zaptel-base.c | |
parent | 66bfdde48464695309f4bb01c59b9a9417ef72e5 (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.c | 30 |
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: |