# Lista 6
###### tags: `SO`
## Zadanie 1
a)
ruid = 2000
euid = 2000
suid = 2000
b)
ruid = 1000
euid = 2000
suid = 0
c)
Nie uda się, ponieważ 2000 nie jest wartością ani ruid, ani suid.
ruid = 1000
euid = 0
suid = 0
d)
ruid = 1000
euid = 2000
suid = 3000
**Czy proces z tożsamością ruid=0, euid=1000, suid=1000 jest uprzywilejowany?**
Nie, ponieważ euid jest różne od 0.
## Zadanie 2
R - można czytać wyłącznie zawartość pliku katalogu
W - można modyfikować zawartość pliku katalogu
X - można czytać metadane plików w katalogu, zawartość pliku oraz przejść do podkatalogu
sticky - plik może usunąć tylko właściciel
set-gid - każdy plik utworzony w katalogu będzie miał gid równy gid właściciela katalogu, a nie użytkownika tworzącego plik
```
if (ruid == 0)
return true
if ruid == sb->st_uid
sprawdź czy mode pokrywa się z bitami S_IRWXU(sb->st_mode)
if rgid == st_gid
sprawdź czy mode pokrywa się z bitami S_IRWXG(sb->st_mode)
sprawdź czy mode pokrywa się z bitami S_IRWXO(sb->st_mode)
```
## Zadanie 3
## Zadanie 4
W celu ochrony przed złośliwymi użytkownikami, upoważnienia powinny być przyznane tylko w chwili, gdy są potrzebne do wykonywanych operacji. W szczególności, gdy upoważnienia nie będą już wcale potrzebne, powinniśmy się ich pozbyć na stałe.
Zdolności do metoda radzenia sobie z dawaniem zbyt wielu uprawnień, gdy nie są potrzebne. Np. gdy program chce zmienić czas systemu, nie potrzebuje absolutnie wszystkich uprawnień, ponieważ w przypadku awarii bądź celowego działania złośliwego użytkownika może zachowywać się w nieoczekiwany sposób i zrobić bałagan. W związku z tym system przydziela tylko te zdolności, które program potrzebuje, a ten pozostaje tego nieświadomy, uznając się za roota.
«CAP_DAC_READ_SEARCH» - R pliku, RX katalogu
«CAP_KILL» - omija sprawdzanie pozwolenia na wysyłanie sygnałów
**Kiedy proces użytkownika może wysłać sygnał do innego procesu?**
Bash wysyłający SIG_CONT.
## Zadanie 5
**Jakie zadania pełni procedura exit(3) z biblioteki standardowej?**
Wywołuje po kolei zarejestrowane funkcje atexit() i onexit() w odwrotnej kolejności. Jeśli któraś funkcja nie wróci lub się zabije kolejne nie są wykonywane. Otwarte strumienie stdio są czyszczone i zamykane. Pliki tymczasowe usuwane.
Po forku stan buforów jest dziedziczony, dlatego gdy bufor nie jest pusty przed forkiem, dziecko odziedziczy po rodzicu jego zawartość, co może skutkować podwójnym wypisaniem.
Jeśli przed execve bufor nie zostanie zflushowany, dane mogą nie zostać wypisane.
`_exit(2)` również nie flushuje buforów.
Domyślne strategie buforowania:
a) plik terminala - line buffered
b) plik zwykły - fully buffered
c) standardowe wyjście błędów - unbuffered
Wywołać `fflush` na otwartych strumieniach.
## Zadanie 6
## Zadanie 7