[python] Buffer overflow na Win7?

Petr Přikryl prikryl na atlas.cz
Čtvrtek Červenec 15 12:09:17 CEST 2010


>> To znamená, že to může mít co do činění s použitím vyrovnávacího
>> bufferu, který může být v Linuxu a pod Windows obsluhován jinak
>
>Takze to znamena, ze Windowsi fread() "obsahuje" buffer overflow? OK,
>chapu, nemusi to byt chyba pythonu, ale v takovem pripade to je snad
>jeste horsi.

Je to asi chyba v Pythonu, protože Python by neměl takovou situaci dovolit.
Dokumentace ale svým způsobem na tento nedodělek upozorňuje.

V Pythonu 3 už to funguje.

>Co se tyka toho 'a+', zkousel jsem to i s jinymi R/W mody, ale
>vysledek stejny. Znamena to, ze Windows ma z nejakeho duvodu problem s
>"obousmerne" otevrenym souborem? Bavil jsem se o tom s kolegou
>javistou, ktery tvrdi, ze treba v Jave vubec koncept R/W souboru neni
>(udajne jsou jen R nebo W streamy). Tak me napadlo, ze to je proste
>jejich "workaround" pro platformove specificke problemy s praci se
>soubory.

Ona je to taky trochu koncepční záležitost. Když je soubor otevřen
pro připisování na konec, jak lze správně rozhodnout, že soubor
už skončil?  Pokud chci použít operaci "přečti soubor až do konce souboru",
je takový požadavek vůbec korektní?

Další zádrhel, který by v tomto případě mohl hrát roli, je rozlišování
binárního a textového otevření souboru. Je všeobecně známé, že 
řada vývojářů pod Unixem na rozlišování kašle, protože obsah
souboru v ASCII načteme stejně, ať se to otevře v textovém nebo
v binárním režimu. V textovém režimu se taky z důvodů
kompatibility interpretuje Ctrl-Z jako EOF. V současnosti ale asi
nikdo explicitně do souboru jako EOF znak Ctrl-Z necpe. Je možné,
že implementace interpretace EOF můžou být různě zprasené.

Otvírání textových souborů pro současné čtení a zápis je ale 
taky problematické, protože textové soubory už často bývají v UTF-8
a seek lze dělat jen velmi opatrně.  Jediný spolehlivý způsob
je chovat se k souboru jako k stream.

Java je UNICODE, takže odtud může pramenit rozhodnutí 
nedělat podobné low-level prasárny jako seek v textovém souboru.

Petr


Další informace o konferenci Python