diff options
author | Peter Huewe <peterhuewe@gmx.de> | 2013-02-13 09:28:14 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-02-13 12:33:38 -0500 |
commit | fc9ca48eb60f4a516f59bbde1dc7685744ceb310 (patch) | |
tree | 260126093f2f3f6b4e5465272b34bab0ca786f53 | |
parent | b7e6724238409d0985dcf7219dd9eb0a1f58e7e5 (diff) |
staging/comedi: Fix undefined array subscript
In vmk80xx_do_insn_bits the local variable reg, which is used as an
index to the tx_buf array, can be used uninitialized if
- data[0] == 0
and
- devpriv->model != VMK8061_MODEL
-> we get into the else branch without having reg initialized.
Since the driver usually differentiates between VMK8061_MODEL and
VMK8055_MODEL it's safe to assume that VMK8055_DO_REG was meant as an
initial value.
And to avoid duplication we can move the assignments to the top.
Acked-by: Ian Abbott <abbotti@mev.co.uk>
Acked-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/comedi/drivers/vmk80xx.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/staging/comedi/drivers/vmk80xx.c b/drivers/staging/comedi/drivers/vmk80xx.c index ebf2d4824860..eed46ee4f710 100644 --- a/drivers/staging/comedi/drivers/vmk80xx.c +++ b/drivers/staging/comedi/drivers/vmk80xx.c | |||
@@ -675,8 +675,14 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev, | |||
675 | if (data[0]) | 675 | if (data[0]) |
676 | dir |= DIR_OUT; | 676 | dir |= DIR_OUT; |
677 | 677 | ||
678 | if (devpriv->model == VMK8061_MODEL) | 678 | if (devpriv->model == VMK8061_MODEL) { |
679 | dir |= DIR_IN; | 679 | dir |= DIR_IN; |
680 | reg = VMK8061_DO_REG; | ||
681 | cmd = VMK8061_CMD_DO; | ||
682 | } else { /* VMK8055_MODEL */ | ||
683 | reg = VMK8055_DO_REG; | ||
684 | cmd = VMK8055_CMD_WRT_AD; | ||
685 | } | ||
680 | 686 | ||
681 | retval = rudimentary_check(devpriv, dir); | 687 | retval = rudimentary_check(devpriv, dir); |
682 | if (retval) | 688 | if (retval) |
@@ -688,14 +694,6 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev, | |||
688 | tx_buf = devpriv->usb_tx_buf; | 694 | tx_buf = devpriv->usb_tx_buf; |
689 | 695 | ||
690 | if (data[0]) { | 696 | if (data[0]) { |
691 | if (devpriv->model == VMK8055_MODEL) { | ||
692 | reg = VMK8055_DO_REG; | ||
693 | cmd = VMK8055_CMD_WRT_AD; | ||
694 | } else { /* VMK8061_MODEL */ | ||
695 | reg = VMK8061_DO_REG; | ||
696 | cmd = VMK8061_CMD_DO; | ||
697 | } | ||
698 | |||
699 | tx_buf[reg] &= ~data[0]; | 697 | tx_buf[reg] &= ~data[0]; |
700 | tx_buf[reg] |= (data[0] & data[1]); | 698 | tx_buf[reg] |= (data[0] & data[1]); |
701 | 699 | ||
@@ -706,7 +704,6 @@ static int vmk80xx_do_insn_bits(struct comedi_device *dev, | |||
706 | } | 704 | } |
707 | 705 | ||
708 | if (devpriv->model == VMK8061_MODEL) { | 706 | if (devpriv->model == VMK8061_MODEL) { |
709 | reg = VMK8061_DO_REG; | ||
710 | tx_buf[0] = VMK8061_CMD_RD_DO; | 707 | tx_buf[0] = VMK8061_CMD_RD_DO; |
711 | 708 | ||
712 | retval = vmk80xx_read_packet(devpriv); | 709 | retval = vmk80xx_read_packet(devpriv); |