Commit b3ab6fbf authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: comedi_bond: fix 'b_mask' calc in bonding_dio_insn_bits()

'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: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 351f6689
...@@ -101,7 +101,8 @@ static int bonding_dio_insn_bits(struct comedi_device *dev, ...@@ -101,7 +101,8 @@ static int bonding_dio_insn_bits(struct comedi_device *dev,
b_chans = bdev->nchans - base_chan; b_chans = bdev->nchans - base_chan;
if (b_chans > n_left) if (b_chans > n_left)
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_write_mask = (write_mask >> n_done) & b_mask;
b_data_bits = (data_bits >> n_done) & b_mask; b_data_bits = (data_bits >> n_done) & b_mask;
/* Read/Write the new digital lines. */ /* Read/Write the new digital lines. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment