Як гурӯҳ аз Донишгоҳи Миннесота тафсилотро дар бораи тағироти зараровар фиристодашуда ошкор кард

Пас аз як номаи кушоди узрхоҳӣ, як гурӯҳи муҳаққиқон аз Донишгоҳи Миннесота, ки қабули тағирот ба ядрои Linux аз ҷониби Грег Кроа-Хартман манъ шуда буд, маълумоти муфассалро дар бораи часпакҳои ба таҳиягарони ядро ​​фиристодашуда ва мукотиба бо нигоҳдорон ошкор карданд. марбут ба ин папкаҳо.

Чолиби диккат аст, ки бо ташаббуси нигахдо-рон хамаи патчхои проблемавй рад карда шуда буданд, ягон патч тасдик карда нашудааст. Ин далел равшан мекунад, ки чаро Грег Кроа-Хартман ин қадар дағалона рафтор кардааст, зеро маълум нест, ки агар часпакҳо аз ҷониби нигоҳдорон тасдиқ карда мешуданд, муҳаққиқон чӣ кор мекарданд. Дар паси андеша, онҳо иддао карданд, ки онҳо ният доранд, ки дар бораи хатогӣ гузориш диҳанд ва иҷоза намедоданд, ки часбҳо ба Git бираванд, аммо маълум нест, ки онҳо воқеан чӣ кор мекарданд ва то чӣ андоза онҳо то куҷо рафтаанд.

Ҳамагӣ дар моҳи августи соли 2020 аз суроғаҳои номаълум [почтаи электронӣ ҳифз карда шудааст] и [почтаи электронӣ ҳифз карда шудааст] (нома аз Ҷеймс Бонд) панҷ часб фиристода шуд: ду дуруст (1, 2) ва се дорои хатогиҳои пинҳонӣ (1, 2, 3), фароҳам овардани шароит барои осебпазирӣ. Ҳар як пачка танҳо 1-4 сатри кодро дар бар мегирифт. Идеяи асосии паси часбҳои хато ин буд, ки ислоҳи ихроҷи хотира метавонад ҳолати осебпазирии дукаратаи озодро эҷод кунад. Пас аз як ҳафта, маълумот ба таҳиягарони ядро ​​​​бо пешниҳоди баррасии имкони пешбурди осебпазириҳо зери пардаи ислоҳи ночиз барои ихроҷи хотира фиристода шуд, аммо дар бораи кӯшишҳои қаблии фиристодани часпакҳои зараровар чизе гуфта нашудааст.

Аввалин ямоқи мушкилӣ ихроҷи хотираро тавассути илова кардани занг ба kfree() пеш аз баргардонидани назорат дар сурати хатогӣ ислоҳ кард, аммо барои дастрасӣ ба майдони хотира пас аз озод шудан (истифода пас аз озод) шароит фароҳам овард. Ин часпак аз ҷониби нигоҳдор (Ҷири Слаби) рад карда шуд, ки мушкилотро муайян кард ва қайд кард, ки як сол пеш касе аллакай кӯшиш карда буд, ки тағироти шабеҳро пешниҳод кунад ва он дар аввал қабул карда шуд, аммо пас аз муайян кардани шароити осебпазирӣ партофта шуд. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > - агар (!p2) баргардад -ENOMEM; > + агар (!p2) { > + kfree(p1); > + бозгашт -ENOMEM; > + }

Дар ямоқи дуюм низ дорои шароит барои мушкилоти истифодаи пас аз озод. Ямоқи нишондодашуда аз ҷониби нигоҳдор қабул карда нашуд (Дан Карпентер), ки ямоқиро бо сабаби мушкилоти дигар бо list_add_tail рад кард, аммо пай набурд, ки нишондиҳандаи "chdev" метавонад дар функсияи put_device, ки дар зер дар занг истифода мешавад, озод карда шавад. dev_err(&chdev ->dev...). Аммо, ямоқи қабул карда нашуд, гарчанде ки бо сабабҳои ба осебпазирӣ алоқаманд набуд. агар (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc ноком шуд\n"); ret = -ENOMEM; goto err_fifo;

Ямоқи сеюм низ аз ҷониби нигоҳдор (Микэл Райнал) бо сабаби хатои дигаре, ки ба осебпазирӣ алоқаманд нест, қабул нашуд (занги дукарата барои гузоштан барои pdev). агар (!window->virt) { printk(KERN_ERR MOD_NAME ": iomap(%08lx, %08lx) ноком шуд\n", window->phys, window->size); + pci_dev_put(pdev); баромадан; } ... if (!map) { printk(KERN_ERR MOD_NAME ": kmalloc ноком шуд"); + pci_dev_put(pdev); баромадан; } memset(харита, 0, sizeof(*харита)); ... агар (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); map->mtd = NULL; + pci_dev_put(pdev); баромадан; }

Ҷолиб он аст, ки дар аввал аз 4 часпак 5-тоаш мушкилот доранд, вале худи муҳаққиқон иштибоҳ карданд ва дар як часпак, ки мушкил буд, ба назари онҳо, ислоҳи дуруст бидуни шароити пешбинишудаи истифодаи хотира пас аз пайдоиши озод пешниҳод шуд. хато = pci_request_mem_regions (pdev, nitrox_driver_name); агар (хато) {pci_disable_device(pdev); + dev_err(&pdev->dev, "Дархости минтақаҳои хотира иҷро нашуд!\n"); хато баргаштан; }

Манбаъ: opennet.ru

Илова Эзоҳ