Potěšilo mne, že se alespoň popisuje mkstemp(), který je použitelně bezpečný, a ne zvěrstva jako mktemp(). Nicméně
-- protože se string, co se předává jako argument, přepisuje, nesmí to být konstantní string; v uvedeném příkladu se ten string alokuje na zásobníku, takže ho lze v pohodě přepsat, ale IMHO zápis v příkladu svádí k chybnému použití
-- na Linuxu se současnou glibc se lze spoléhat na to, že mód je po otevření 0600; nicméně nic takového není POSIXem stanoveno; takže buď před otevřením nastavit umask, nebo si raději vyrobit jméno sám a použít open() s příslušným módem, O_EXCL atd. (chmod až po otevření je zjevná chyba souběhu (race condition))
-- existuje funkce fdopen(), která umožňuje udělat z filedescriptoru normální stdio stream, takže se není nutné uchylovat k write() a read(), pokud nechci
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.).
Docasny soubor se vytvori pomoci mkstemp() a hned se smaze pomoci unlink(). Lze vytvoreny docasny soubor ulozit pozdeji (pred zavrenim a definitivnim smazanim) pod novym jmenem (pokud se treba vypocet dokonci)? Mam na mysli hodne velky docasny soubor, takze copy() do finalniho souboru by nebylo efektivni a zbytecne by pozadovalo dalsi diskovu kapacitu. Rekneme, ze se jedna o ISO obraz CD.