Docasne soubory, symlink race atd.
Jan Kasprzak
kas na informatics.muni.cz
Čtvrtek Listopad 23 14:57:29 CET 2000
Tak jsem si cetl v ruznych standardech, a porad mi neni prilis
jasne, jak vytvaret bezpecne docasne soubory ve sdilenem adresari jako
je /tmp.
Na urovni knihovnich funkci je to vcelku jednoduche:
mkstemp(3) dela presne tohle. Jediny problem je, ze SUSv2 doporucuje:
: For portability with previous versions of this document,
: tmpfile() is preferred over this function.
(viz mkstemp(3) v SUSv2).
Jenze tmpfile(3) vraci jednak FILE * misto deskriptoru,
a jednak nevraci existujici soubor, ale rovnou vytvoreny soubor
unlink()uje.
Na urovni shell scriptu je to take v podstate jasne:
mktemp(1) dela to, co potrebuji, a ocekavam od neho, ze se bude chovat
bezpecne.
Nejhorsi je to na urovni sluzeb jadra. Pokud predpokladam
nesdilene /tmp, pro jednoznacnost by melo stacit volat open(2)
s O_CREAT|O_EXCL. Horsi je to se symbolickymi linky. Matne si vzpominam,
ze na l-k Linus psal, ze O_CREAT|O_EXCL neprojde, pokud posledni casti
jmena je sym. link, ale v zadne norme ani v manove strance open(2) to neni
dokumentovano. Na mem RH7.0 ale open(2) pise:
: O_NOFOLLOW
: If pathname is a symbolic link, then the open
: fails. This is a FreeBSD extension, which was
: added to Linux in version 2.1.126. Symbolic links
: in earlier components of the pathname will still be
: followed. The headers from glibc 2.0.100 and later
: include a definition of this flag; kernels before
: 2.1.126 will ignore it if used.
Nicmene pokud si dam "strace mktemp /tmp/aXXXXXX", dostavam
tohle:
...
open("/tmp/aGifAtj", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 3
...
Takze evidentne mktemp(1) zadne O_NOFOLLOW nepouziva
a spoleha na to, ze O_EXCL|O_CREAT neakceptuje v Linuxu symlink
jako posledni komponentu cesty.
Jak to teda je? Mate nekdo prehled o tom, jak lze portabilne
vytvaret docasne soubory ve sdilenem adresari? Nepiste, ze mam udelat
nesdileny adresar - to samozrejme udelam, pokud to jen trochu bude
mozne. Ale obecne to vzdy mozne neni.
-Yenya
--
\ Jan "Yenya" Kasprzak <kas at fi.muni.cz> http://www.fi.muni.cz/~kas/
\\ PGP: finger kas at aisa.fi.muni.cz 0D99A7FB206605D7 8B35FCDE05B18A5E //
\\\ Czech Linux Homepage: http://www.linux.cz/ ///
/// I find that rebooting the machine and cursing myself is one of the \\\
// most effective kernel debugging methods. -Victor Yodaiken \\
Další informace o konferenci Linux