staging: comedi: comedi_bond: fix 'b_mask' calc in bonding_dio_insn_bits()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Mon, 20 Apr 2015 18:49:04 +0000 (11:49 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Apr 2015 15:15:59 +0000 (17:15 +0200)
'b_chans' may be a valud up to 32. 'b_mask' is an unsigned int and a left shift of
more than 31 bits has undefined behavior. Fix the calc so it works correctly with
a 'b_chans' of 32..

Reported-by: coverity (CID 1192244)
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/comedi_bond.c

index 96db0c2686a1e6971478ee74c23412049fb654cf..50b76eccb7d708cfc112e523f0d633440264a031 100644 (file)
@@ -101,7 +101,8 @@ static int bonding_dio_insn_bits(struct comedi_device *dev,
                        b_chans = bdev->nchans - base_chan;
                        if (b_chans > n_left)
                                b_chans = n_left;
-                       b_mask = (1U << b_chans) - 1;
+                       b_mask = (b_chans < 32) ? ((1 << b_chans) - 1)
+                                               : 0xffffffff;
                        b_write_mask = (write_mask >> n_done) & b_mask;
                        b_data_bits = (data_bits >> n_done) & b_mask;
                        /* Read/Write the new digital lines. */