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