Skip to content

Commit 4dad25a

Browse files
committed
Merge tag 'staging-7.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging driver fixes from Greg KH: "Here are three small staging driver fixes for 7.0-rc4 that resolve some reported problems. They are: - two rtl8723bs data validation bugfixes - sm750fb removal path bugfix All of these have been in linux-next for many weeks with no reported issues" * tag 'staging-7.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: staging: rtl8723bs: fix potential out-of-bounds read in rtw_restruct_wmm_ie staging: rtl8723bs: properly validate the data in rtw_get_ie_ex() staging: sm750fb: add missing pci_release_region on error and removal
2 parents 1c9982b + a752816 commit 4dad25a

4 files changed

Lines changed: 26 additions & 17 deletions

File tree

drivers/staging/rtl8723bs/core/rtw_ieee80211.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,20 +186,25 @@ u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, u
186186

187187
cnt = 0;
188188

189-
while (cnt < in_len) {
189+
while (cnt + 2 <= in_len) {
190+
u8 ie_len = in_ie[cnt + 1];
191+
192+
if (cnt + 2 + ie_len > in_len)
193+
break;
194+
190195
if (eid == in_ie[cnt]
191-
&& (!oui || !memcmp(&in_ie[cnt+2], oui, oui_len))) {
196+
&& (!oui || (ie_len >= oui_len && !memcmp(&in_ie[cnt + 2], oui, oui_len)))) {
192197
target_ie = &in_ie[cnt];
193198

194199
if (ie)
195-
memcpy(ie, &in_ie[cnt], in_ie[cnt+1]+2);
200+
memcpy(ie, &in_ie[cnt], ie_len + 2);
196201

197202
if (ielen)
198-
*ielen = in_ie[cnt+1]+2;
203+
*ielen = ie_len + 2;
199204

200205
break;
201206
}
202-
cnt += in_ie[cnt+1]+2; /* goto next */
207+
cnt += ie_len + 2; /* goto next */
203208
}
204209

205210
return target_ie;

drivers/staging/rtl8723bs/core/rtw_mlme.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1988,7 +1988,10 @@ int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_
19881988
while (i < in_len) {
19891989
ielength = initial_out_len;
19901990

1991-
if (in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 && in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 && in_ie[i + 5] == 0x02 && i + 5 < in_len) { /* WMM element ID and OUI */
1991+
if (i + 5 < in_len &&
1992+
in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 &&
1993+
in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 &&
1994+
in_ie[i + 5] == 0x02) {
19921995
for (j = i; j < i + 9; j++) {
19931996
out_ie[ielength] = in_ie[j];
19941997
ielength++;

drivers/staging/sm750fb/sm750.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,7 @@ static void lynxfb_pci_remove(struct pci_dev *pdev)
11231123

11241124
iounmap(sm750_dev->pvReg);
11251125
iounmap(sm750_dev->pvMem);
1126+
pci_release_region(pdev, 1);
11261127
kfree(g_settings);
11271128
}
11281129

drivers/staging/sm750fb/sm750_hw.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,11 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
3636

3737
pr_info("mmio phyAddr = %lx\n", sm750_dev->vidreg_start);
3838

39-
/*
40-
* reserve the vidreg space of smi adaptor
41-
* if you do this, you need to add release region code
42-
* in lynxfb_remove, or memory will not be mapped again
43-
* successfully
44-
*/
39+
/* reserve the vidreg space of smi adaptor */
4540
ret = pci_request_region(pdev, 1, "sm750fb");
4641
if (ret) {
4742
pr_err("Can not request PCI regions.\n");
48-
goto exit;
43+
return ret;
4944
}
5045

5146
/* now map mmio and vidmem */
@@ -54,7 +49,7 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
5449
if (!sm750_dev->pvReg) {
5550
pr_err("mmio failed\n");
5651
ret = -EFAULT;
57-
goto exit;
52+
goto err_release_region;
5853
}
5954
pr_info("mmio virtual addr = %p\n", sm750_dev->pvReg);
6055

@@ -79,13 +74,18 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev)
7974
sm750_dev->pvMem =
8075
ioremap_wc(sm750_dev->vidmem_start, sm750_dev->vidmem_size);
8176
if (!sm750_dev->pvMem) {
82-
iounmap(sm750_dev->pvReg);
8377
pr_err("Map video memory failed\n");
8478
ret = -EFAULT;
85-
goto exit;
79+
goto err_unmap_reg;
8680
}
8781
pr_info("video memory vaddr = %p\n", sm750_dev->pvMem);
88-
exit:
82+
83+
return 0;
84+
85+
err_unmap_reg:
86+
iounmap(sm750_dev->pvReg);
87+
err_release_region:
88+
pci_release_region(pdev, 1);
8989
return ret;
9090
}
9191

0 commit comments

Comments
 (0)