media: dib0700: fix undefined behavior in tuner shutdown
authorMichael Kuron <michael.kuron@gmail.com>
Sun, 26 Sep 2021 20:51:26 +0000 (21:51 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Fri, 19 Nov 2021 16:22:42 +0000 (16:22 +0000)
commitf7b77ebe6d2f49c7747b2d619586d1aa33f9ea91
tree7d494832cf543ebe1ac987942d0e93ef47407474
parent4160420012b9b0a594793b6d644016ae4b8c9409
media: dib0700: fix undefined behavior in tuner shutdown

This fixes a problem where closing the tuner would leave it in a state
where it would not tune to any channel when reopened. This problem was
discovered as part of https://github.com/hselasky/webcamd/issues/16.

Since adap->id is 0 or 1, this bit-shift overflows, which is undefined
behavior. The driver still worked in practice as the overflow would in
most environments result in 0, which rendered the line a no-op. When
running the driver as part of webcamd however, the overflow could lead
to 0xff due to optimizations by the compiler, which would, in the end,
improperly shut down the tuner.

The bug is a regression introduced in the commit referenced below. The
present patch causes identical behavior to before that commit for
adap->id equal to 0 or 1. The driver does not contain support for
dib0700 devices with more adapters, assuming such even exist.

Tests have been performed with the Xbox One Digital TV Tuner on amd64.
Not all dib0700 devices are expected to be affected by the regression;
this code path is only taken by those with incorrect endpoint numbers.

Link: https://lore.kernel.org/linux-media/1d2fc36d94ced6f67c7cc21dcc469d5e5bdd8201.1632689033.git.mchehab+huawei@kernel.org
Cc: stable@vger.kernel.org
Fixes: 7757ddda6f4f ("[media] DiB0700: add function to change I2C-speed")
Signed-off-by: Michael Kuron <michael.kuron@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/usb/dvb-usb/dib0700_core.c