Zadanie 4: Powrót Kalkulatora Wyborczego¶
Data ogłoszenia: 06.06.2019
Termin oddania: 05.09.2019 (brak możliwości spóźnienia)
Materiały dodatkowe¶
parse.py
: narzędzie do wyświetlania danych z ulepszonych plikówcore
z4-test.tar.gz
: testy do zadania
Wprowadzenie¶
Niestety, nie wszystkie rozwiązania pierwszego zadania spełniły nasze
oczekiwania – w niektórych okręgach wyborczych, Kalkulator Wyborczy
zakończył działanie śmiertelnym sygnałem SIGSEGV
. Ze względów bezpieczeństwa,
nie możemy używać debuggera na maszynach liczących głosy – dostaliśmy jedynie
zrzuty core
wytworzone przez nasz Kalkulator. Przy analizie tych zrzutów
pojawił się poważny problem: przyczyna błędów leży najprawdopodobniej w kodzie
obsługi plików, a zrzuty core
nie zawierają żadnych informacji o otwartych
plikach w momencie awarii programu.
Zadanie¶
Dopisać do kodu tworzącego pliki core
w jądrze kod zrzucający tablicę otwartych
plików w momencie śmierci procesu, pozwalając nam na zdebugowanie kodu przed jesiennymi wyborami.
Szczegóły¶
Ponieważ jeden plik core
może zawierać wiele wątków z różnymi tablicami deskryptorów
(przypadek CLONE_VM
bez CLONE_FILES
),
plik powinien zawierać osobny zrzut tablicy deskryptorów dla każdego wątku (analogicznie
do zrzutów rejestrów). Każdy z tych zrzutów powinien być jedną strukturą ElfXX_Note
o nazwie LINUX
i nowo zdefiniowanym typie NT_FDS
(numeryczna wartość 0x4f4453
).
Struktura ta powinna
być umieszczona bezpośrednio po wszystkich strukturach opisujących stan rejestrów danego wątku.
Zawartość (pole desc
) tej struktury powinna być następująca:
uint32_t num_fds
: liczba otwartych deskryptorówdla każdego deskryptora, po kolei:
uint32_t fd
: numer deskryptora,uint32_t flags
: flagi pliku (polef_flags
wstruct file
),uint64_t pos
(niekoniecznie wyrównane): pozycja w pliku (polef_pos
),uint32_t mode
: tryb otwarcia pliku (polef_mode
),uint32_t domain
: jeżeli plik jest socketem, domena socketu (czyli stałaAF_*
), w przeciwnym wypadku-1
,uint32_t type
: jeżeli plik jest socketem, typ socketu (czyli stałaSOCK_*
), w przeciwnym wypadku-1
,uint16_t local_addr_len
jeżeli plik jest socketem i ma lokalny adres, rozmiar lokalnego adresu w bajtach, w przeciwnym wypadku 0,uint16_t remote_addr_len
jeżeli plik jest socketem i ma zdalny adres, rozmiar zdalnego adresu w bajtach, w przeciwnym wypadku 0,uint8_t local_addr[local_addr_len]
: jeżeli plik jest socketem, lokalny adres (czyli to, co zwróciłobygetsockname
),uint8_t remote_addr[remote_addr_len]
: jeżeli plik jest socketem, zdalny adres (czyli to, co zwróciłobygetpeername
),char path[]
: ścieżka do pliku, zakończona bajtem zerowym. W przypadku plików specjalnych (socket, pipe, …), należy użyć tej samej sztucznej nazwy, co system plikówproc
,uint8_t _pad[]
: tyle bajtów zerowych, ile potrzeba, by wyrównać pozycję do 4 bajtów.
Do weryfikacji, że dane są zrzucane w poprawnym formacie, dostarczamy skrypt parse.py
.
Zasady oceniania¶
Za zadanie można uzyskać do 10 punktów. Na ocenę zadania składają się dwie części:
funkcjonalność rozwiązania:
brak specjalnej obsługi socketów – wypełnienie pól
domain
/type
/*_addr
stałymi wartościami (0 punktów)pełne rozwiązanie z obsługą socketów (2 punkty)
wynik testów (od 0 do 8 punktów)
ocena kodu rozwiązania (od 0 do -10 punktów)
Punktacja¶
Testy weryfikujące działanie socketów były warte 2 pkt., a pozostałe testy - 8pkt.
Punkty z oceny kodu:
Niepoprawna postać rozwiązania / nienakładający patch (-2.0)
Brak README (-0.1)
Copy-paste kodu (wiele funkcji zamiast makra) (-0.0)
Wyciek pamięci (-0.5)
Nadmiarowy diff (zmiany dot. wyłącnie białych znaków) (-0.0)
Dodawanie stałej (małej) liczby bajtów local_addr / remote_addr do core (-0.5, tylko jeśli przechodzą testy)
Użycie polskiego nazewnictwa (-0.2)
Definicja typu NT_FDS w niestandardowym miejscu / brak definicji (-0.0)
Race condition – możliwoć wystąpienia zmiany stanu między obliczaniem potrzebnej pamięci a momentem kopiowania (-0.5)
Forma rozwiązania¶
Jako rozwiązanie należy wysłać paczkę zawierającą:
patcha na jądro w wersji 4.20.8, w jednym z następujących formatów:
patch wygenerowaniy przez diffa z opcjami
-uprN
nakładający się przezpatch -p1
git format-patch
krótki opis rozwiązania
Rozwiązania prosimy nadsyłać na adres p.zuk@mimuw.edu.pl
z kopią
do mwk@mimuw.edu.pl
.