Skip to content

Commit 6310a88

Browse files
YueHaibingdavem330
authored andcommitted
net: fddi: fix a possible null-ptr-deref
bp->SharedMemAddr is set to NULL while bp->SharedMemSize lesser-or-equal 0, then memset will trigger null-ptr-deref. fix it by replacing pci_alloc_consistent with dma_zalloc_coherent. Signed-off-by: YueHaibing <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 58d813a commit 6310a88

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed

drivers/net/fddi/skfp/skfddi.c

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -297,11 +297,11 @@ static int skfp_init_one(struct pci_dev *pdev,
297297
return 0;
298298
err_out5:
299299
if (smc->os.SharedMemAddr)
300-
pci_free_consistent(pdev, smc->os.SharedMemSize,
301-
smc->os.SharedMemAddr,
302-
smc->os.SharedMemDMA);
303-
pci_free_consistent(pdev, MAX_FRAME_SIZE,
304-
smc->os.LocalRxBuffer, smc->os.LocalRxBufferDMA);
300+
dma_free_coherent(&pdev->dev, smc->os.SharedMemSize,
301+
smc->os.SharedMemAddr,
302+
smc->os.SharedMemDMA);
303+
dma_free_coherent(&pdev->dev, MAX_FRAME_SIZE,
304+
smc->os.LocalRxBuffer, smc->os.LocalRxBufferDMA);
305305
err_out4:
306306
free_netdev(dev);
307307
err_out3:
@@ -328,17 +328,17 @@ static void skfp_remove_one(struct pci_dev *pdev)
328328
unregister_netdev(p);
329329

330330
if (lp->os.SharedMemAddr) {
331-
pci_free_consistent(&lp->os.pdev,
332-
lp->os.SharedMemSize,
333-
lp->os.SharedMemAddr,
334-
lp->os.SharedMemDMA);
331+
dma_free_coherent(&pdev->dev,
332+
lp->os.SharedMemSize,
333+
lp->os.SharedMemAddr,
334+
lp->os.SharedMemDMA);
335335
lp->os.SharedMemAddr = NULL;
336336
}
337337
if (lp->os.LocalRxBuffer) {
338-
pci_free_consistent(&lp->os.pdev,
339-
MAX_FRAME_SIZE,
340-
lp->os.LocalRxBuffer,
341-
lp->os.LocalRxBufferDMA);
338+
dma_free_coherent(&pdev->dev,
339+
MAX_FRAME_SIZE,
340+
lp->os.LocalRxBuffer,
341+
lp->os.LocalRxBufferDMA);
342342
lp->os.LocalRxBuffer = NULL;
343343
}
344344
#ifdef MEM_MAPPED_IO
@@ -394,7 +394,9 @@ static int skfp_driver_init(struct net_device *dev)
394394
spin_lock_init(&bp->DriverLock);
395395

396396
// Allocate invalid frame
397-
bp->LocalRxBuffer = pci_alloc_consistent(&bp->pdev, MAX_FRAME_SIZE, &bp->LocalRxBufferDMA);
397+
bp->LocalRxBuffer = dma_alloc_coherent(&bp->pdev.dev, MAX_FRAME_SIZE,
398+
&bp->LocalRxBufferDMA,
399+
GFP_ATOMIC);
398400
if (!bp->LocalRxBuffer) {
399401
printk("could not allocate mem for ");
400402
printk("LocalRxBuffer: %d byte\n", MAX_FRAME_SIZE);
@@ -407,23 +409,22 @@ static int skfp_driver_init(struct net_device *dev)
407409
if (bp->SharedMemSize > 0) {
408410
bp->SharedMemSize += 16; // for descriptor alignment
409411

410-
bp->SharedMemAddr = pci_alloc_consistent(&bp->pdev,
411-
bp->SharedMemSize,
412-
&bp->SharedMemDMA);
412+
bp->SharedMemAddr = dma_zalloc_coherent(&bp->pdev.dev,
413+
bp->SharedMemSize,
414+
&bp->SharedMemDMA,
415+
GFP_ATOMIC);
413416
if (!bp->SharedMemAddr) {
414417
printk("could not allocate mem for ");
415418
printk("hardware module: %ld byte\n",
416419
bp->SharedMemSize);
417420
goto fail;
418421
}
419-
bp->SharedMemHeap = 0; // Nothing used yet.
420422

421423
} else {
422424
bp->SharedMemAddr = NULL;
423-
bp->SharedMemHeap = 0;
424-
} // SharedMemSize > 0
425+
}
425426

426-
memset(bp->SharedMemAddr, 0, bp->SharedMemSize);
427+
bp->SharedMemHeap = 0;
427428

428429
card_stop(smc); // Reset adapter.
429430

@@ -442,15 +443,15 @@ static int skfp_driver_init(struct net_device *dev)
442443

443444
fail:
444445
if (bp->SharedMemAddr) {
445-
pci_free_consistent(&bp->pdev,
446-
bp->SharedMemSize,
447-
bp->SharedMemAddr,
448-
bp->SharedMemDMA);
446+
dma_free_coherent(&bp->pdev.dev,
447+
bp->SharedMemSize,
448+
bp->SharedMemAddr,
449+
bp->SharedMemDMA);
449450
bp->SharedMemAddr = NULL;
450451
}
451452
if (bp->LocalRxBuffer) {
452-
pci_free_consistent(&bp->pdev, MAX_FRAME_SIZE,
453-
bp->LocalRxBuffer, bp->LocalRxBufferDMA);
453+
dma_free_coherent(&bp->pdev.dev, MAX_FRAME_SIZE,
454+
bp->LocalRxBuffer, bp->LocalRxBufferDMA);
454455
bp->LocalRxBuffer = NULL;
455456
}
456457
return err;

0 commit comments

Comments
 (0)