Hlavní navigace

Názory k článku Programování pod Linuxem pro všechny (3)

  • Článek je starý, nové názory již nelze přidávat.
  • 6. 2. 2004 9:35

    Yeti (neregistrovaný)

    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

  • 7. 2. 2004 11:05

    galaxi (neregistrovaný)

    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!!!

  • 7. 2. 2004 14:20

    Yeti (neregistrovaný)

    Nepředvídatelný název souboru je jedna věc (BTW random() je bez seedu z něčeho jako /dev/random předvídatelný, nevím moc, jak ho seedovat v DOSu, aby byl opravdu nepřevídatelný...), další jsou jeho otevření se správnými právy, bez možnosti symlink útoku, etc.

  • 9. 2. 2004 19:28

    Petr Baudis (neregistrovaný)

    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.

  • 9. 2. 2004 22:20

    Jirka Kosina (neregistrovaný)

    > 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.).

  • 21. 12. 2009 18:33

    me (neregistrovaný) ---.36.broadband5.iol.cz

    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.