Below is a list of all bug cases that were reported in the paper in addition to other cases that were discoeved in earlier versions of the Linux kernel.
- Recently Discovered Bug - 10/18/2015
- Bug Case Study I
- Bug Case Study II
- Bug Case Study III
- Bug Case Study IV
- Bug Case Study V
- Bug Case Study VI
- Bug Case Study VII
- Bug Case Study VIII
- Bug Case Study IX
- Bug Case Study X
- Bug Case Study XI
- Bug Case Study XII
- Bug Case Study XIII
Recently Discovered Bug
Version:4.3-rc6
Source File: /v4.3-rc6/drivers/media/pci/ddbridge/ddbridge-core.c
Function tuner_attach_tda18271
(line 595) acquires a lock on port->i2c_gate_lock
via the call to the function pointer (input->fe->ops.i2c_gate_ctrl(input->fe, 1))
(line 601) which calls function drxk_gate_ctrl
. However, when the call to function dvb_attach
on line 602 fails (returns NULL), the lock on port->i2c_gate_lock
is never released.
The bug is currently on the master branch which is v4.3-rc6 as of writing this report.
Bug Case Study I
Version:3.19-rc1
Source File: /v3.19-rc1/drivers/mmc/host/toshsd.c
Function toshsd_thread_irq
has an unpaired lock spin_lock_irqsave(&host->lock, flags)
at line 176. The bug occurs when the function returns at line 179 without unlocking the spin object host->lock
.
The bug was spread across all the release candiates of 3.19-rc1 through 3.19-rc7 and got fixed in 4.0. The fixing commit id is: 8a66fdae771487762519db0546e9ccb648a2f911
.
Bug Case Study II
Version:3.19-rc1
Source File: /v3.19-rc1/drivers/scsi/fnic/fnic_fcs.c
Function fnic_handle_fip_timer
has an unpaired lock spin_lock_irqsave(&fnic->vlans_lock, flags)
at line 1284. The bug occurs when variable vlan->state
has the value of FIP_VLAN_AVAIL
when entering the switch
block at line 1298. The switch block does not have a case to handle the value FIP_VLAN_AVAIL
. Thus causing the function to return without unlocking the spin object &fnic->vlans_lock
.
The bug has been reported and accepted, however it is still persisting on the latest Linux kernel branch.
Bug Case Study III
Version:3.18-rc1
Source File: /v3.18-rc1/drivers/usb/dwc2/gadget.c
Function s3c_hsotg_ep_enable
has an unpaired lock spin_lock_irqsave(&hsotg->lock, flags)
at line 2487. The bug occurs when the function returns at line 2565 without unlocking the spin object &hsotg->lock
.
The bug was spread across 3.18-rc1 and 3.18-rc2 and fixed in 3.18-rc3. The fixing commit id is: b585a48b8a9486f26a68886278f2c8f981676dd4
.
Bug Case Study IV
Version:3.18-rc1
Source File: /v3.18-rc1/drivers/scsi/fnic/fnic_fcs.c
Function fnic_handle_fip_timer
has an unpaired lock spin_lock_irqsave(&fnic->vlans_lock, flags)
at line 1279. The bug occurs when variable vlan->state
has the value of FIP_VLAN_AVAIL
when entering the switch
block at line 1293. The switch block does not have a case to handle the value FIP_VLAN_AVAIL
. Thus causing the function to return without unlocking the spin object &fnic->vlans_lock
.
The bug has been reported and accepted, however it is still persisting on the latest Linux kernel branch.
Bug Case Study V
Version:3.18-rc1
Source File: /v3.18-rc1/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
Function stmmac_xmit
has an unpaired lock spin_lock(&priv->tx_lock)
at line 1906. The bug occurs when the function returns at line 2031 without unlocking the spin object priv->tx_lock
.
The bug was spread across all the release candiates from 3.18-rc1 through 3.18-rc6 and got fixed in 3.18-rc7. The fixing commit id is: 758a0ab59b9bed75d8c8fcaed3cb41f10a586793
.
Bug Case Study VI
Version:3.17-rc1
Source File: /v3.17-rc1/drivers/scsi/fnic/fnic_fcs.c
Function fnic_handle_fip_timer
has an unpaired lock spin_lock_irqsave(&fnic->vlans_lock, flags)
at line 1278. The bug occurs when variable vlan->state
has the value of FIP_VLAN_AVAIL
when entering the switch
block at line 1292. The switch block does not have a case to handle the value FIP_VLAN_AVAIL
. Thus causing the function to return without unlocking the spin object &fnic->vlans_lock
.
The bug has been reported and accepted, however it is still persisting on the latest Linux kernel branch.
Bug Case Study VII
Version:3.17-rc1
Source File: /drivers/scsi/megaraid/megaraid_sas_fusion.c
Function megasas_reset_fusion
has an unpaired lock mutex_lock(&instance->reset_mutex)
at line 2353. The bug occurs when the function returns at line 2358 without unlocking the mutex object instance->reset_mutex
.
The bug has been fixed in 3.17-rc2. The fixing commit id is: a2fbcbc3f0aa3bea3bf5c86e41f9c543c8de9e75
.
Bug Case Study VIII
Version:3.13
Source File: /v3.13/fs/ext4/ioctl.c
Function swap_inode_boot_loader
has an unpaired lock that is acquired through the call to function: lock_two_nondirectories(inode, inode_bl)
at line 133. The bug occurs when the function returns at line 147 without unlocking the mutex object inode->mutex
. The locking/unlocking of the mutex object is performed inter-procedurall through the call to functions: lock_two_nondirectories(inode, inode_bl)
for locking and unlock_two_nondirectories(inode, inode_bl)
for unlocking.
The bug was spread across multiple major releases: 3.10, 3.11, 3.12, and 3.13 and has been fixed in later release. The fixing commit id is: 30d29b119ef01776e0a301444ab24defe8d8bef3
.
Bug Case Study IX
Version:3.13
Source File: /drivers/gpu/drm/drm_crtc.c
Function drm_crtc_init
has an unpaired lock acquired through the inter-procedural call drm_modeset_lock_all(dev)
at line 636. The bug occurs when the function returns at line 642 without unlocking the mutex object config->mutex
. The locking/unlocking of the mutex object is performed inter-procedurall through the call to functions: drm_modeset_lock_all(dev)
for locking and drm_modeset_unlock_all(dev)
for unlocking.
The bug has been accepted and became obselete in next release 3.14-rc1.
Bug Case Study X
Version:3.12
Source File: /v3.12/net/core/netpoll.c
Function netpoll_send_skb_on_dev
has an unpaired lock acquired through the true branch of the branch condition for the inter-procedural call __netif_tx_trylock(txq)
at line 383. The bug occurs when the function breaks the loop at line 390 without unlocking the spin object txq->_xmit_lock
. The locking/unlocking of the mutex object is performed inter-procedurall through the call to functions: __netif_tx_trylock
which locks an object if the call returns non-zero and __netif_tx_unlock
for unlocking.
The bug was fixed in later release. The fixing commit id is: aca5f58f9ba803ec8c2e6bcf890db17589e8dfcc
.
Bug Case Study XI
Version:3.3
Source File: /v3.3/net/bluetooth/rfcomm/tty.c
Function rfcomm_tty_open
has an unpaired lock acquired through the inter-procedural call to tty_lock
at line 728. The bug occurs when the function breaks the infinite loop at lines 715, 719, and 723 without unlocking the mutex object tty->legacy_mutex
. The locking/unlocking of the mutex object is performed inter-procedurall through the call to functions: tty_lock
for locking and tty_unlock
for unlocking.
The bug became obselete at next release.
Bug Case Study XII
Version:3.2
Source File: /v3.2/drivers/net/wireless/wl12xx/sdio.c
In function wl1271_remove
: the mutex object wl->mutex
may get locked upon the return of function wl1271_unregister_hw
through the call to function __wl1271_plt_stop
. However, the lock is never released upon exit of function wl1271_unregister_hw
. The buggy scenario happens as follows:
wl1271_remove
calls wl1271_unregister_hw
which acquires the locks. Then, wl1271_remove
calls wl1271_free_hw
which tries to lock the object the already locked in wl1271_unregister_hw
which causes a deadlock scenario.
The bug persisted over 3.2 and 3.3 releases and got fixed in fixed in later release. The fixing commit id is: f3df1331f25f782e838a3ecb72cec86b539ac02f
.