Linux 5.18 puhul on kavas kood erinevate probleemide lahendamiseks teisaldada C uuemale versioonile. 

Mis on Linux ja milleks see on mõeldud?

Protsessi käigus arendaja arutelu Linuxi tuumast umbes jal teema komplekti paigad haavatavuste parandamiseks Spectre koodis, et töötada lingitud loenditega, sai selgeks paljude arendajate jaoks on see probleem saaks lihtsamini lahendada, kui oli kerneli koodis lubatud C que vastab standardi uuemale versioonile. 

Ja praegu peab Linuxi tuumale lisatud kood vastama ANSI C (C89) spetsifikatsioonile, mis moodustati 1989. aastal.

See on põhjus, miks Specteriga seotud probleem koodis oli seepärast, et sjätkas iteraatori kasutamist tsükli järel eraldi määratletud.

Vaatamata oma üldiselt kiirele olemusele tugineb kerneli projekt mitmetele vanematele tööriistadele. Kuigi kriitikutele meeldib keskenduda kogukonna laialdasele e-posti kasutamisele, on tõenäoliselt olulisem anakronism C-keelestandardi 1989. aasta versiooni kasutamine kerneli koodi jaoks, standard, mis kodifitseeriti enne tuumaprojekti algust üle 30 aasta tagasi. Näib, et see pikaajaline praktika võib lõppeda niipea, kui kernel 5.18, eeldatavasti selle aasta mais.

Seda mainitakse makrot kasutatakse lingitud loendi elementide kordamiseks, ja kuna tsükli iteraator antakse sellele makrole, on see defineeritud väljaspool tsüklit ennast ja jääb pärast tsüklit kättesaadavaks. C99 standardi kasutamine võimaldaks arendajatel defineerida tsükli jaoks muutujaid plokis for(), mis lahendaks probleemi ilma lahendusi välja mõtlemata.

Kahjuks on tuumas mitu asukohta, kus loend on
iteraatorit kasutatakse pärast tsüklit, mis sellisel muudatusel katkeb. Õnneks
on olemas skript use_after_iter.cocci, mida saab kasutada selliste tuvastamiseks
koodi asukohad. Pidin skripti veidi kohandama, kuna see vähendab valesid
algse kasutusjuhtumi positiivseid omadusi, kuid need on selle plaastri puhul asjakohased.

Paljud teatatud koodiasukohad kasutavad loendi iteraatorit alles pärast seda
tsükkel, kui oli varajane väljumine (break/goto) ja seetõttu nad seda ei ole
asjakohane.

Omalt Linus Torvalds nõustus ideega et saaks rakendada uuemate spetsifikatsioonide tuge ja soovitas edasi liikuda kerneli versioonile 5.18, et kasutada 11. aastal välja antud C2011 standardit.

Pärast seda möödus eelkontrolli käigus uues režiimis GCC-le ja Clangile paigaldamine kõrvalekaldeta. Kui ulatuslikuma testimise tõttu ettenägematuid probleeme ei teki, muudavad 5.18 kerneli ehitusskriptid suvandi „–std=gnu89” väärtuseks „–std=gnu11 -Wno-shift-negative-value”.

Linus Torvaldsile plaaster väga ei meeldinud ja ta ei näinud, kuidas see on seotud spekulatiivsete täitmise haavatavustega. Kuid pärast seda, kui Koschel olukorda täiendavalt selgitas, nõustus Torvalds, et "see on lihtsalt tavaline viga, lihtne ja lihtne" ning ütles, et see tuleks parandada sõltumata suuremast seeriast. Kuid siis süvenes ta probleemi tegelikku allikasse: et iteraator, mis edastati loendi läbimise makrodele, tuleb deklareerida väljaspool tsüklit ennast:

Peamine põhjus, miks seda tüüpi mittespekulatiivsed vead võivad tekkida, on see, et ajalooliselt ei olnud meil C99-stiilis "muutujate deklareerimist tsüklites". Nii et list_for_each_entry() ja kõik teised filtreerivad põhimõtteliselt alati tsüklist välja viimase kirje HEAD lihtsalt seetõttu, et me ei saanud iteraatori muutujat tsüklis endas deklareerida.

Seda tasub ka mainida kaaluti C17 standardi kasutamise võimalust, kuid sel juhul oleks vaja GCC minimaalselt toetatud versiooni suurendada, kuna C11 toe kaasamine vastab praegu kehtivatele GCC versiooni (5.1) nõuetele.

Lõpuks kui olete huvitatud sellest rohkem teada saama, saate üksikasju vaadata järgmine link.


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutav: AB Internet Networks 2008 SL
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.