21-letnia Polka naprawiła Linuxa. I ma dla nas istotną lekcję

konto.spidersweb.pl 3 godzin temu

Ta usterka przez dwie dekady dręczyła użytkowników klasycznego środowiska linuxowego – Enlightenment E16. Kamila Szewczyk zamiast narzekać zdecydowała się ją… po prostu usunąć. Zrobiła coś, czego nikt nie potrafił przez dekady.

Młoda programistka, 21‑letnia Kamila Szewczyk, znalazła i naprawiła błąd w kodzie menedżera okien Enlightenment E16. Błąd, który siedział tam od około 2006 r. I który potrafił zawiesić cały pulpit jednym… za długim tytułem okna. Nie dość, iż zawstydziła starszych kolegów i koleżanki, to jeszcze na dodatek była uprzejma poświęcić swój czas i opisać na swoim blogu, jak odkryła, zdebugowała i poprawiła błąd. Niezwykle przyjemna lektura.

Co to w ogóle jest Enlightenment E16 i kto go jeszcze używa?

Enlightenment to jeden z najstarszych wciąż rozwijanych menedżerów okien dla Uniksa i Linuksa. Projekt wystartował w 1997 r., a gałąź E16 (DR16) pojawiła się w 1999 r. – i żyje do dziś, choć większość świata dawno przesiadła się na nowsze wcielenia Enlightenment albo na zupełnie inne środowiska.

E16 ma dziś status „kultowego reliktu”: lekki (Kamila podaje ok. 24 MB peak RSS), mocno konfigurowalny, przyjazny klawiaturowym wyjadaczom, do tego wciąż „ładny” w swoim retro‑stylu. To typ oprogramowania, które nie goni za modą – zamiast tego latami szlifuje to, co już ma. Nowe wersje to głównie poprawki błędów i drobne usprawnienia, a nie kolejne warstwy funkcji, których nikt nie potrzebował.

Właśnie w takim, pozornie „domkniętym” projekcie, od dwóch dekad czekał sobie błąd, który potrafił zamrozić cały pulpit.

Enlightenment E16 (zrzut ekranowy z bloga Kamili Szewczyk)

Jak zawiesić cały pulpit jednym PDF‑em

Scenariusz, od którego zaczęła się cała historia i który Kamila opisuje, brzmi znajomo, w sumie niezależnie od używanego systemu: ostatnia chwila przed zajęciami, dopieszczanie slajdów, kilka plików PDF z wykładem i zadaniami. Kamila, doktorantka na Uniwersytecie Saary, otwiera jeden z plików w Atrilu – i nagle cały desktop się zamraża. Zero reakcji. Twardy reset sesji X11 z TTY.

Błąd jest się w pełni powtarzalny: ten konkretny PDF = natychmiastowy freeze. Winowajcą okazuje się tytuł pliku. Mechanizm w E16 działa tak: jeżeli tytuł jest za długi, to menedżer próbuje go „przeciąć” w środku i wstawić w tytule okna interfejsu wielokropek: początek tytułu…koniec tytułu. Brzmi rozsądnie. Problem w tym, iż implementacja tego dopasowywania używa wariantu metody Newtona – i robi to bez żadnego limitu iteracji.

W uproszczeniu: funkcja próbuje oszacować, ile znaków trzeba „wyciąć” ze środka, żeby zmieścić się w zadanej szerokości. Liczy średnią szerokość znaku (piksele na znak), porównuje aktualną szerokość z limitem, a potem koryguje liczbę usuwanych znaków – w górę lub w dół – na podstawie tego, jak bardzo się „przestrzeliła”. Mamy przybliżenie, mamy „pochodną” (średnią szerokość znaku), poprawiamy wynik i liczymy jeszcze raz.

Niestety metoda Newtona to algorytm, który – pisząc kolokwialnie – może się rozjechać. Może nie zbiegać w ogóle, może oscylować między dwoma punktami, może się „rozbiec” w nieskończoność. Dlatego w podręcznikach zawsze pojawia się ten sam, nudny, ale najważniejszy punkt: limit iteracji i sensowna tolerancja błędu.

W E16 tego limitu nie było. Pętla działała „dopóki nie zadziała”. A w przypadku tytułu PDF‑a Kamili wpadła w idealną pułapkę: dwustanową oscylację. Raz usuwała 8 znaków, potem 11, potem znowu 8, potem 11… i tak w kółko. Tekst był za każdym razem przeliczany, fonty mierzone, ale warunek zakończenia nigdy nie był spełniony. Efekt z punktu widzenia użytkownika: cały pulpit zamrożony, bo menedżer okien kręci się w nieskończonej pętli, próbując dopasować tytuł okna.

Trzy linijki filozofii w trzech poprawkach do kodu

Kamila przygotowała łatkę do wersji E16 1.0.30 (wydanej w sierpniu 2024 r.). Poprawka jest zaskakująco prosta. Po pierwsze, wprowadza limit iteracji – 32 kroki. jeżeli po 32 próbach algorytm wciąż nie znalazł idealnego dopasowania, a aktualny wariant tytułu mieści się w zadanej szerokości, to po prostu go akceptuje. jeżeli się nie mieści – zwiększa liczbę usuwanych znaków o 1 i próbuje jeszcze raz. Koniec z nieskończonym kręceniem się w kółko.

Po drugie, limit dla parametru nuke_count: liczba usuwanych znaków nie może spaść poniżej 1. To zabezpiecza przed kuriozalnymi przypadkami, w których korekta w dół powoduje, iż „ogon” tytułu zaczyna nachodzić na „głowę” – dostajemy wtedy dziwne, zdegenerowane ciągi znaków.

Po trzecie, limit dla cw, czyli średniej szerokości znaku: nie może spaść poniżej 1. Dzięki temu choćby jeżeli pomiar szerokości tekstu zwróci coś patologicznego (np. zero), to nie zamienimy wzorów na krok Newtona w dzielenie przez zero.

„Nowe” kontra „skończone”. Co ta historia mówi o współczesnym sofcie

Kamila wprost mówi, iż lubi E16 właśnie dlatego, iż to oprogramowanie jest w pewnym sensie „skończone”. Nie w znaczeniu „porzucone”, tylko: ma zestaw funkcji, który jest wystarczający, a kolejne wydania to głównie poprawki błędów i drobne usprawnienia, a nie niekończący się strumień nowinek. „W kółko dostarczamy niestabilność, której nie musimy dostarczać”, jak pisze.

Kamila w swoim poście na blogu przywołuje bardzo świeże przykłady: choćby wpadkę w jądrze Linuksa 6.6 LTS, gdzie poprawka w gałęzi stabilnej sprawiła, iż wywołanie fgetxattr(54321, NULL, NULL, 0) – które powinno po prostu zwrócić błąd EINVAL – powodowało crash kernela. Łatka została gwałtownie wycofana, ale przez kilka dni w stabilnym jądrze istniał banalny wektor DoS.

Do tego dochodzi jeszcze afera z backdoorem w XZ Utils – bibliotece kompresji, która trafiła do dystrybucji w wersji z potencjalnie celowo wprowadzonym, zaawansowanym backdoorem. Kamila opisuje moment, w którym na laptopie z Debianem Sid w trakcie kompilacji kodu czyta o XZ 5.6.0 i z przerażeniem sprawdza, czy przypadkiem nie ma tej wersji w systemie.

Na tym tle „stare, nudne” oprogramowanie rozwijane przez mały zespół z niewielką liczbą funkcji i powoli malejącą liczbą bugów zaczyna wyglądać jak całkiem rozsądna strategia. Mniej wektorów ataku, mniej niespodzianek, mniej feature’ów, których i tak nie użyjesz.

Co z tego wynika dla zwykłego użytkownika (który nie pisze własnego menedżera okien)

Jeśli na co dzień żyjesz w świecie elektroniki użytkowej, to ta historia brzmi znajomo także poza Linuksem. Telefony, telewizory, routery, konsole – wszystko żyje w trybie ciągłej aktualizacji. Nowe funkcje, nowe integracje, nowe UI, nowe bugi.

Kamila sugeruje bardzo pragmatyczne podejście: jeżeli nie musisz, to nie goń za każdą nową wersją. Zostań na świeżym, ale stabilnym wydaniu – najlepiej LTS – i pozwól, żeby liczba błędów w tej konkretnej gałęzi z czasem malała. Aktualizować łatki bezpieczeństwa, ale nie rzucać się na każdą „rewolucję” w interfejsie czy zestawie funkcji.

To nie jest recepta dla wszystkich – są scenariusze, w których trzeba mieć absolutnie najnowsze biblioteki, sterowniki czy API. Ale dla ogromnej części użytkowników i administratorów to podejście „żyj z tym co działa i patrz, jak maleje liczba bugów” jest po prostu rozsądne. I bardzo odświeżające.

BuyboxFast
Idź do oryginalnego materiału