Forwarded: [PATCH] net: atm: fix shift-out-of-bounds in __vcc_connect()
syzbot <[email protected]>
| Newsgroups | org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
For archival purposes, forwarding an incoming command email to [email protected], [email protected]. *** Subject: [PATCH] net: atm: fix shift-out-of-bounds in __vcc_connect() Author: [email protected] #syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master dev->ci_range.vpi_bits and vci_bits can legitimately be ATM_CI_MAX (-1), a sentinel meaning "no range configured, use maximum" (see include/uapi/linux/atmdev.h). Some drivers, such as usbatm_atm_init() in drivers/usb/atm/usbatm.c, set this sentinel and never resolve it to an actual bit width. __vcc_connect() uses these fields directly as a shift amount without checking for the sentinel, so binding a PVC socket on such a device triggers a negative shift: UBSAN: shift-out-of-bounds in net/atm/common.c:381:10 shift exponent -1 is negative Skip the range check when ci_range.vpi_bits/vci_bits is still ATM_CI_MAX, since that value means "unrestricted". Reported-by: [email protected] Closes: https://syzkaller.appspot.com/bug?extid=6665d3db5fef15914802 Signed-off-by: Deepanshu Kartikey <[email protected]> --- net/atm/common.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/atm/common.c b/net/atm/common.c index 81195727fa18..73057bb016f7 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -378,8 +378,11 @@ static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, short vpi, int error; if ((vpi != ATM_VPI_UNSPEC && vpi != ATM_VPI_ANY && + dev->ci_range.vpi_bits != ATM_CI_MAX && vpi >> dev->ci_range.vpi_bits) || (vci != ATM_VCI_UNSPEC && - vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits)) + vci != ATM_VCI_ANY && + dev->ci_range.vci_bits != ATM_CI_MAX && + vci >> dev->ci_range.vci_bits)) return -EINVAL; if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE)) return -EPERM; -- 2.34.1