ืฆื•ื•ืช ืžืื•ื ื™ื‘ืจืกื™ื˜ืช ืžื™ื ืกื•ื˜ื” ื—ืฉืฃ ืคืจื˜ื™ื ืขืœ ื”ืฉื™ื ื•ื™ื™ื ื”ื–ื“ื•ื ื™ื™ื ืฉื ืฉืœื—ื•.

ื‘ืขืงื‘ื•ืช ืžื›ืชื‘ ื”ืชื ืฆืœื•ืช ืคืชื•ื—, ืงื‘ื•ืฆืช ื—ื•ืงืจื™ื ืžืื•ื ื™ื‘ืจืกื™ื˜ืช ืžื™ื ืกื•ื˜ื”, ืฉื’ืจื’ ืงืจื•ืื”-ื”ืจื˜ืžืŸ ื—ืกืžื” ืืช ืงื‘ืœืช ื”ืฉื™ื ื•ื™ื™ื ื‘ืงืจื ืœ ื”ืœื™ื ื•ืงืก, ื—ืฉืคื” ืžื™ื“ืข ืžืคื•ืจื˜ ืขืœ ื”ืชื™ืงื•ื ื™ื ืฉื ืฉืœื—ื• ืœืžืคืชื—ื™ ื”ืœื™ื‘ื” ื•ื”ื”ืชื›ืชื‘ื•ืช ืขื ื”ืžืชื—ื–ืงื™ื ื”ืงืฉื•ืจื™ื ืœื˜ืœืื™ื ื”ืœืœื•.

ืจืื•ื™ ืœืฆื™ื™ืŸ ื›ื™ ื›ืœ ื”ืชื™ืงื•ื ื™ื ื”ื‘ืขื™ื™ืชื™ื™ื ื ื“ื—ื• ื‘ื™ื•ื–ืžืช ื”ืžืชื—ื–ืงื™ื, ืืฃ ืชื™ืงื•ืŸ ืื—ื“ ืœื ืื•ืฉืจ. ืขื•ื‘ื“ื” ื–ื• ืžื‘ื”ื™ืจื” ืžื“ื•ืข ื’ืจื’ ืงืจื•ืื”-ื”ืจื˜ืžืŸ ืคืขืœ ื‘ืฆื•ืจื” ื›ื” ืงืฉื”, ืฉื›ืŸ ืœื ื‘ืจื•ืจ ืžื” ื”ื—ื•ืงืจื™ื ื”ื™ื• ืขื•ืฉื™ื ืื™ืœื• ื”ืชื™ืงื•ื ื™ื ื”ื™ื• ืžืื•ืฉืจื™ื ืขืœ ื™ื“ื™ ื”ืžืชื—ื–ืงื™ื. ื‘ื“ื™ืขื‘ื“, ื”ื ื˜ืขื ื• ืฉื”ื ื”ืชื›ื•ื•ื ื• ืœื“ื•ื•ื— ืขืœ ื‘ืื’ ื•ืœื ื”ื™ื• ืžืืคืฉืจื™ื ืœืชื™ืงื•ื ื™ื ืœืขื‘ื•ืจ ืœ-Git, ืื‘ืœ ืœื ื‘ืจื•ืจ ืžื” ื”ื ื”ื™ื• ืขื•ืฉื™ื ื‘ืคื•ืขืœ ื•ืขื“ ื›ืžื” ืจื—ื•ืง ื”ื ื”ื™ื• ื”ื•ืœื›ื™ื.

ืกืš ื”ื›ืœ ื‘ืื•ื’ื•ืกื˜ 2020 ืžื›ืชื•ื‘ื•ืช ืื ื•ื ื™ืžื™ื•ืช [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ] ะธ [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ] (ืžื›ืชื‘ ืžื’'ื™ื™ืžืก ื‘ื•ื ื“) ื ืฉืœื—ื• ื—ืžื™ืฉื” ืชื™ืงื•ื ื™ื: ืฉื ื™ื™ื ื ื›ื•ื ื™ื (1, 2) ื•ืฉืœื•ืฉื” ื”ืžื›ื™ืœื™ื ืฉื’ื™ืื•ืช ื ืกืชืจื•ืช (1, 2, 3), ื•ื™ื•ืฆืจื™ื ืชื ืื™ื ืœืคื’ื™ืขื•ื™ื•ืช. ื›ืœ ืชื™ืงื•ืŸ ื”ื›ื™ืœ ืจืง 1-4 ืฉื•ืจื•ืช ืงื•ื“. ื”ืจืขื™ื•ืŸ ื”ืžืจื›ื–ื™ ืžืื—ื•ืจื™ ื”ืชื™ืงื•ื ื™ื ื”ืฉื’ื•ื™ื™ื ื”ื™ื” ืฉืชื™ืงื•ืŸ ื“ืœื™ืคืช ื–ื™ื›ืจื•ืŸ ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืžืฆื‘ ืคื’ื™ืขื•ืช ืคื ื•ื™ ื›ืคื•ืœ. ืฉื‘ื•ืข ืœืื—ืจ ืžื›ืŸ ื ืฉืœื— ืžื™ื“ืข ืœืžืคืชื—ื™ ื”ืœื™ื‘ื” ืขื ื”ืฆืขื” ืœื“ื•ืŸ ื‘ืืคืฉืจื•ืช ืœืงื“ื ื ืงื•ื“ื•ืช ืชื•ืจืคื” ื‘ืžืกื•ื•ื” ืฉืœ ืชื™ืงื•ื ื™ื ื˜ืจื™ื•ื•ื™ืืœื™ื™ื ืœื“ืœื™ืคื•ืช ื–ื™ื›ืจื•ืŸ, ืืš ื“ื‘ืจ ืœื ื ืืžืจ ืขืœ ื ื™ืกื™ื•ื ื•ืช ืงื•ื“ืžื™ื ืœืฉืœื•ื— ื˜ืœืื™ื ื–ื“ื•ื ื™ื™ื.

ื”ืชื™ืงื•ืŸ ื”ื‘ืขื™ื™ืชื™ ื”ืจืืฉื•ืŸ ืชื™ืงืŸ ืืช ื“ืœื™ืคืช ื”ื–ื™ื›ืจื•ืŸ ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ืงืจื™ืื” ืœ-kfree() ืœืคื ื™ ื”ื—ื–ืจืช ื”ืฉืœื™ื˜ื” ื‘ืžืงืจื” ืฉืœ ืฉื’ื™ืื”, ืืš ื™ืฆืจ ืชื ืื™ื ืœื’ื™ืฉื” ืœืื–ื•ืจ ื”ื–ื™ื›ืจื•ืŸ ืœืื—ืจ ืฉื”ืฉืชื—ืจืจ (use-after-free). ื”ืชื™ืงื•ืŸ ื”ื–ื” ื ื“ื—ื” ืขืœ ื™ื“ื™ ื”ืžืชื—ื–ืง (Jiri Slaby), ืฉื–ื™ื”ื” ืืช ื”ื‘ืขื™ื” ื•ื”ืฆื‘ื™ืข ืขืœ ื›ืš ืฉืœืคื ื™ ืฉื ื” ืžื™ืฉื”ื• ื›ื‘ืจ ื ื™ืกื” ืœื”ืฆื™ืข ืฉื™ื ื•ื™ ื“ื•ืžื” ื•ื”ื•ื ื”ืชืงื‘ืœ ื‘ืชื—ื™ืœื”, ืืš ืœืื—ืจ ืžื›ืŸ ื ืžื—ืง ืœืื—ืจ ื–ื™ื”ื•ื™ ื”ืชื ืื™ื ืœืคื’ื™ืขื•ืช. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > - ืื (!p2) ืžื—ื–ื™ืจื” -ENOMEM; > + if (!p2) { > + kfree(p1); > + ื”ื—ื–ืจ -ENOMEM; > + }

ื”ืชื™ืงื•ืŸ ื”ืฉื ื™ ื”ื›ื™ืœ ื’ื ืชื ืื™ื ืœื‘ืขื™ื” ืฉืœืื—ืจ ื”ืฉื™ืžื•ืฉ. ื”ืชื™ืงื•ืŸ ืฉืฆื•ื™ืŸ ืœื ื”ืชืงื‘ืœ ืขืœ ื™ื“ื™ ื”ืžืชื—ื–ืง (ื“ืŸ ืงืจืคื ื˜ืจ), ืฉื“ื—ื” ืืช ื”ืชื™ืงื•ืŸ ืขืงื‘ ื‘ืขื™ื” ืื—ืจืช ืขื list_add_tail, ืืš ืœื ืฉื ืœื‘ ืฉื ื™ืชืŸ ืœืฉื—ืจืจ ืืช ืžืฆื‘ื™ืข ื”"chdev" ื‘ืคื•ื ืงืฆื™ื™ืช put_device, ื”ืžืฉืžืฉืช ืœื”ืœืŸ ื‘ืงืจื™ืื” dev_err(&chdev ->dev..). ืขื ื–ืืช, ื”ืชื™ืงื•ืŸ ืœื ื”ืชืงื‘ืœ, ืื ื›ื™ ืžืกื™ื‘ื•ืช ืฉืื™ื ืŸ ืงืฉื•ืจื•ืช ืœืคื’ื™ืขื•ืช. if (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc ื ื›ืฉืœ\n"); ret = -ENOMEM; goto err_fifo;

ื’ื ื”ืชื™ืงื•ืŸ ื”ืฉืœื™ืฉื™ ืœื ื”ืชืงื‘ืœ ืขืœ ื™ื“ื™ ื”ืžืชื—ื–ืง (ืžื™ืงืœ ืจื™ื™ื ืœ) ื‘ื’ืœืœ ื‘ืื’ ืื—ืจ ืฉืœื ืงืฉื•ืจ ืœืคื’ื™ืขื•ืช (ืงืจื™ืื” ื›ืคื•ืœื” ืœ-pdev). if (!window->virt) { printk(KERN_ERR MOD_NAME ": ioremap(%08lx, %08lx) ื ื›ืฉืœ\n", window->phys, window->size); + pci_dev_put(pdev); ืœืฆืืช ื”ื—ื•ืฆื”; } ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc ื ื›ืฉืœ"); + pci_dev_put(pdev); ืœืฆืืช ื”ื—ื•ืฆื”; } memset(map, 0, sizeof(*map)); ... if (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); map->mtd = NULL; + pci_dev_put(pdev); ืœืฆืืช ื”ื—ื•ืฆื”; }

ืžืขื ื™ื™ืŸ ืฉื‘ื”ืชื—ืœื” 4 ืžืชื•ืš 5 ืชื™ืงื•ื ื™ื ื”ื•ื ื—ื• ืขื ื‘ืขื™ื•ืช, ืืš ื”ื—ื•ืงืจื™ื ืขืฆืžื ืขืฉื• ื˜ืขื•ืช ื•ื‘ืชื™ืงื•ืŸ ืื—ื“ ืฉื”ื™ื” ื‘ืขื™ื™ืชื™, ืœื“ืขืชื, ื”ื•ืฆืข ืชื™ืงื•ืŸ ื ื›ื•ืŸ, ืœืœื ื”ืชื ืื™ื ื”ืฆืคื•ื™ื™ื ืœืฉื™ืžื•ืฉ ื‘ื–ื™ื›ืจื•ืŸ ืœืื—ืจ ื”ืชืจื—ืฉื•ืช ื—ื•ืคืฉื™ืช. err = pci_request_mem_regions(pdev, nitrox_driver_name); if (err) { pci_disable_device(pdev); + dev_err(&pdev->dev, "ื ื›ืฉืœ ื‘ื‘ืงืฉืช ืื–ื•ืจื™ mem!\n"); ืฉื’ื™ืื” ื—ื•ื–ืจืช; }

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”