Dajme tomu,že by sme mali vytvoriť nepredvídateľný názov súboru.no v Linuxe veľmi neprogramujem(nezabite ma) ale v Dos-eje take daco ako random() ja si myslim,ze takto sa da urobit celkom nepredvidatelny subor.
A uspori sa tym zdrojak.
//nejedzte Kinder pinguin-Tucniaky sa maju chranit nie jest!!!
Pokud uz to chcete delat rucne, random() neni dostatecne jedinecny, tzn. je moznost, ze dvema soucasnym procesum vyjde stejny nazev souboru. Z tohoto hlediska je mnohem rozumnejsi getpid(), ktere je takto unikatni. Pak si musite zkontrolovat, jestli ten soubor uz neexistuje, napriklad ho utocnik muze predvytvorit jako symlink nekam k sobe a data si pak precist.
> pak si musite zkontrolovat, jestli ten soubor uz
> neexistuje, napriklad ho utocnik muze predvytvorit
> jako symlink nekam k sobe a data si pak precist
Testovani existence/neexistence souboru samo o sobe smrdi race condition, pokud se neudela spravne.
Tzn naivni reseni, ktere lze jeste dnes najit skutecne v leckterych programech (a ktere nefunguje), je (v pseudokodu):
stat(filename, &st);
if (!S_ISREG(st.st_mode)) return(-1);
fd = open(filename, ...)
mezi radky 2 a 3 je na prvni pohled viditelna race condition - pokud utocnik trefi chvili, kdy probehl test ze soubor neni symlink (radka 2), ale jeste se soubor neotevrel (neprobehla radka 3) a vytvori v tu chvili symlink, ma vyhrano.
Jedno ze spravnych reseni je soubor nejdrive pomoci open() otevrit a pak teprve na od jadra pridelenem deskriptoru provadet fstat() - je zaruceno, ze jakmile programu kernel jednou deskriptor priradi, "to pod nim" se uz zmenit nemuze (tzn. nikdo nam nevymeni soubor za symlink, apod.).