Messages in this thread Patch in this message | | | Date | Fri, 29 Apr 2011 11:55:43 -0700 | From | Greg KH <> | Subject | [20/55] tty/n_gsm: fix bug in CRC calculation for gsm1 mode |
| |
2.6.38-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com>
commit 9db4e4381a8e881ff65a5d3400bfa471f84217e7 upstream.
Problem description: gsm_queue() calculate a CRC for arrived frames. As a last step of CRC calculation it call
gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs);
This work perfectly for the case of GSM0 mode as gsm->received_fcs contain the last piece of data required to generate final CRC.
gsm->received_fcs is not used for GSM1 mode. Thus we put an additional byte to CRC calculation. As result we get a wrong CRC and reject incoming frame.
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
--- drivers/tty/n_gsm.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
--- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -1659,8 +1659,12 @@ static void gsm_queue(struct gsm_mux *gs if ((gsm->control & ~PF) == UI) gsm->fcs = gsm_fcs_add_block(gsm->fcs, gsm->buf, gsm->len); - /* generate final CRC with received FCS */ - gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs); + if (gsm->encoding == 0){ + /* WARNING: gsm->received_fcs is used for gsm->encoding = 0 only. + In this case it contain the last piece of data + required to generate final CRC */ + gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs); + } if (gsm->fcs != GOOD_FCS) { gsm->bad_fcs++; if (debug & 4)
| |