Yn dilyn llythyr ymddiheuriad agored, derbyniodd grŵp o ymchwilwyr o Brifysgol Minnesota newidiadau i'r cnewyllyn Linux yr oedd Greg Kroah-Hartman wedi'i rwystro rhagddo, datgelodd wybodaeth fanwl am y clytiau a anfonwyd at ddatblygwyr y cnewyllyn a'r gohebiaeth â'r cynhalwyr yn ymwneud â'r clytiau hyn.
Mae'n werth nodi bod yr holl glytiau problemus wedi'u gwrthod gan y cynhalwyr; ni chafodd yr un ohonynt eu cymeradwyo. Mae'r ffaith hon yn helpu i esbonio pam y gweithredodd Greg Kroah-Hartman mor llym, gan nad yw'n glir beth fyddai'r ymchwilwyr wedi'i wneud pe bai'r clytiau wedi'u cymeradwyo gan y cynhalwyr. Wrth edrych yn ôl, honnasant eu bod yn bwriadu adrodd am y nam a byddent wedi atal y clytiau rhag cael eu gwthio i mewn i Git, ond nid yw'n glir beth fyddent wedi'i wneud mewn gwirionedd na pha mor bell y byddent wedi mynd.
At ei gilydd, ym mis Awst 2020, o gyfeiriadau acostag dienw.ubuntuAnfonwyd pum clwt at @gmail.com a jameslouisebond@gmail.com (roedd yr e-bost gan James Bond): dau gywir (1, 2) a thri a oedd yn cynnwys gwallau cudd (1, 2, 3) a greodd amodau ar gyfer gwendidau. Dim ond 1-4 llinell o god oedd ym mhob clwt. Y syniad sylfaenol y tu ôl i'r clwtiau gwallus oedd y gallai trwsio gollyngiad cof greu bregusrwydd oherwydd rhyddhad dwbl. Wythnos yn ddiweddarach, cysylltwyd â datblygwyr y cnewyllyn i drafod y posibilrwydd o hyrwyddo'r gwendidau dan gochl trwsio gollyngiadau cof dibwys, ond ni soniwyd am unrhyw ymdrechion blaenorol i gyflwyno clwtiau maleisus.
Trwsiodd y clwt problemus cyntaf y gollyngiad cof trwy alw kfree() cyn dychwelyd ar wall, ond cyflwynodd amod defnyddio-ar-ôl-ryddhau. Gwrthodwyd y clwt hwn gan y cynhaliwr (Jiri Slaby), a nododd y broblem a thynnodd sylw at y ffaith bod rhywun eisoes wedi cynnig newid tebyg flwyddyn yn ôl, a dderbyniwyd yn wreiddiol ond yna cafodd ei daflu ar ôl i'r bregusrwydd gael ei ddarganfod. > p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL); > — if (!p2) return -ENOMEM; > + if (!p2) { > + kfree(p1); > + return -ENOMEM; > + }
Roedd yr ail clwt hefyd yn cynnwys amodau ar gyfer y mater defnyddio-ar-ôl-rhyddhau. Ni dderbyniwyd y clwt hwn gan y cynhaliwr (Dan Carpenter), a wrthododd y clwt oherwydd problem arall gyda list_add_tail, ond ni sylwodd y gellid rhyddhau'r pwyntydd "chdev", a ddefnyddir yn ddiweddarach yn yr alwad i dev_err(&chdev->dev..), yn y ffwythiant put_device. Fodd bynnag, ni dderbyniwyd y clwt, er am reswm nad oedd yn gysylltiedig â'r bregusrwydd. os (ret < 0) { + put_device(&chdev->dev); dev_err(&chdev->dev, DRV_NAME ": kfifo_alloc failed\n"); ret = -ENOMEM; goto err_fifo;
Ni dderbyniwyd y trydydd clwt gan y cynhaliwr (Miquel Raynal) chwaith oherwydd nam arall nad oedd yn gysylltiedig â'r bregusrwydd (galwad rhoi dwbl i pdev). os yw (!window->virt) { printk(KERN_ERR MOD_NAME ": methodd ioremap(%08lx, %08lx)\n", window->phys, window->size); + pci_dev_put(pdev); goto out; } … os yw (!map) { printk(KERN_ERR MOD_NAME ": methodd kmalloc"); + pci_dev_put(pdev); goto out; } memset(map, 0, sizeof(*map)); … os (mtd_device_register(map->mtd, NULL, 0)) { map_destroy(map->mtd); map->mtd = NULL; + pci_dev_put(pdev); goto out; }
Yn ddiddorol, tybiwyd i ddechrau bod gan 4 allan o 5 clwt broblemau, ond gwnaeth yr ymchwilwyr eu hunain gamgymeriad a chynigion nhw ateb cywir ar gyfer un clwt yr oedden nhw'n credu oedd yn broblemus, heb i'r amodau 'defnyddio ar ôl rhyddhau' disgwyliedig ddigwydd. err = pci_request_mem_regions(pdev, nitrox_driver_name); if (err) { pci_disable_device(pdev); + dev_err(&pdev->dev, "Methwyd gofyn am ranbarthau cof!\n"); return err; }
Ffynhonnell: opennet.ru
