Linux 7.3 donosi rijetku ispravku u FAT upravljačkom programu koja otkriva ozbiljan propust u provjeri duljine naziva datoteka, a koji je mogao dovesti do neočekivanog ponašanja sustava.
Inženjer iz Huaweija, Zizhi Wo, otkrio je i ispravio grešku u FAT upravljačkom programu za FAT12/FAT16/FAT32 formate. Problem je u tome što funkcija msdos_format_name() nije provjeravala gornju granicu duljine naziva datoteke, što je dovodilo do tihog skraćivanja naziva dužih od 255 bajtova (NAME_MAX) na 11 bajtova u 8.3 formatu, a sustav bi to prijavio kao uspješnu operaciju.
Kako je greška funkcionirala
Kada bi korisnik predao naziv datoteke duži od 255 bajtova, primjerice 300 znakova ‘A’, sustav bi ga skratio na 8 znakova i tri razmaka, te bi prijavio uspjeh. Problem postaje ozbiljniji jer VFS (Virtual File System) provjerava samo PATH_MAX, a ne duljinu pojedinačne komponente putanje. To znači da dentry zadržava originalni dugi naziv, ali dobiva priključeni inode, što kasnije izaziva upozorenje u fsnotify_open() funkciji, a događaj se korisniku prijavljuje s praznim nazivom.
Zanimljivo je da vfat nije pogođen ovom greškom jer koristi funkciju xlate_to_uni() koja odbija nazive duže od FAT_LFN_LEN. Ispravak je dodan na samom ulazu u msdos_format_name(), jedinu ulaznu točku za sve msdos nazive, čime se usklađuje s provjerama koje već rade xfs, 9p, ceph i simple_lookup() sustavi.
Šire implikacije za stabilnost
Ovaj slučaj postavlja pitanje koliko još sličnih propusta vreba u jezgri Linuxa. Iako je riječ o rubnom slučaju koji prosječan korisnik vjerojatno nikada neće iskusiti, činjenica da je greška postojala godinama bez da je itko primijetio govori o tome koliko je teško osigurati potpunu ispravnost tako složenog sustava kao što je Linux kernel. Ispravak je već uklopljen u Linux 7.3, a očekuje se i njegov prijenos na stabilne verzije jezgre u skoroj budućnosti.
Ovo je još jedan dokaz da čak i naizgled stabilni i zreli sustavi poput Linuxa kriju neočekivane duboke greške koje čekaju pravog inženjera s dovoljno upornosti da ih pronađe. Pitanje je koliko još ovakvih tihih propusta spava u kodu koji koristimo svakodnevno.
