A folyamat során fejlesztői beszélgetés a linux kernelről kb ésl témája egy sor javítások a sebezhetőségek kijavításához Spectre a kódban a hivatkozott listákkal való együttműködéshez, világossá vált sok fejlesztő számára ez a probléma könnyebben meg lehetne oldani, ha engedélyezve volt a kernelkódban C que megfelel a szabvány újabb verziójának.
És jelenleg a Linux kernelhez hozzáadott kódnak meg kell felelnie az ANSI C (C89) specifikációnak, amelyet 1989-ben alakítottak ki.
Ezért a Spectre-hez kapcsolódó probléma a kódban azért volt, mert sfolyamatosan iterátort használtunk a ciklus után külön meghatározva.
Általában gyors jellege ellenére a kernelprojekt számos régebbi eszközre támaszkodik. Míg a kritikusok szeretnek a közösség széleskörű e-mail-használatára összpontosítani, valószínűleg jelentősebb anakronizmus a C nyelvi szabvány 1989-es verziójának használata a kernelkódhoz, amely szabvány a kernelprojekt több mint 30 évvel ezelőtti elindítása előtt kodifikált. Úgy tűnik, ez a régóta fennálló gyakorlat véget érhet, amint az 5.18-as kernel, várhatóan ez év májusában.
Azt emlegetik egy makrót használnak a hivatkozott lista elemei közötti iterációra, és mivel a hurokiterátort ennek a makrónak adják át, a cikluson kívül van meghatározva, és elérhető marad a ciklus után is. A C99 szabvány használata lehetővé tenné a fejlesztők számára, hogy változókat definiáljanak a for() blokkban lévő ciklushoz, ami megoldaná a problémát anélkül, hogy megkerülő megoldásokat találnának ki.
Sajnos a rendszermagban több helyen is megtalálható a lista
Az iterátort az ilyen változáskor megszakadó ciklus után használjuk. szerencsére
létezik a use_after_iter.cocci szkript, amivel azonosítani lehet
kódhelyek. Kicsit módosítanom kellett a forgatókönyvet, mivel csökkenti a hamis értéket
pozitívumok az eredeti használati esetben, de ezek a javításra vonatkoznak.A jelentett kódhelyek nagy választéka csak ezután használja a lista iterátort
a ciklus, ha volt egy korai kilépés (break/goto), és ezért nem
ide vonatkozó.
A maga részéről Linus Torvalds egyetértett az ötlettel lehetővé tette az újabb specifikációk támogatásának megvalósítását, és javasolta az 5.18-as kernelre való áttérést a 11-ben kiadott C2011 szabvány használatára.
Ezt követően az előzetes ellenőrzés során a GCC-re és a Clang-re való szerelés az új módban eltérés nélkül ment. Hacsak nem merülnek fel előre nem látható problémák a kiterjedtebb tesztelés miatt, az 5.18-as kernel build szkriptjei a „–std=gnu89” beállítást „–std=gnu11 -Wno-shift-negative-value” értékre módosítják.
Linus Torvaldsnak nem nagyon tetszett a javítás, és nem látta, hogyan kapcsolódik a spekulatív végrehajtási sebezhetőségekhez. Miután azonban Koschel tovább magyarázta a helyzetet, Torvalds egyetértett azzal, hogy "ez csak egy normál hiba, egyszerű és egyszerű", és azt mondta, hogy a nagyobb sorozattól függetlenül ki kell javítani. De aztán beleásta magát a probléma valódi forrásába: hogy a listabejárási makróknak átadott iterátort magán a cikluson kívüli hatókörben kell deklarálni:
Az ilyen típusú nem spekulatív hibák fő oka az, hogy történelmileg nem volt C99-stílusú "változók deklarálása ciklusokban". Tehát a list_for_each_entry() - és az összes többi - alapvetően mindig az utolsó HEAD bejegyzést szűri ki a ciklusból, egyszerűen azért, mert magában a ciklusban nem tudtuk deklarálni az iterátorváltozót.
Érdemes megemlíteni azt is mérlegelték a C17 szabvány alkalmazásának lehetőségét, de ebben az esetben szükséges lenne a minimálisan támogatott GCC verzió növelése, mivel a C11 támogatás beépítése megfelel a GCC verzió (5.1) jelenlegi követelményeinek.
Végül ha érdekel, hogy többet tudjon meg róla, ellenőrizheti a részleteket a következő link.