[python] Buffer overflow na Win7?
Petr Přikryl
prikryl na atlas.cz
Čtvrtek Červenec 15 08:01:10 CEST 2010
>nefunguje ani takovyto obycejny priklad:
>
>t = file('blabla.txt', 'a+')
>t.write("Lorem ipsum dolor sit amet")
>print t.read()
>t.close()
>
>Ocekaval jsem, ze se vypise prazdny retezec (vzhledem k tomu, ze se
>snazim cist na konci souboru). Tento priklad ale opakovane a bez
>vyjimky do konzole vypise nekolik kB binarnich dat, mezi kterymi
>dokazu identifikovat napriklad jmena ostatnich souboru v aktualnim
>adresari - predpokladam, ze mi python zobrazil cast surovych dat
>filesystemu.
Můžu potvrdit stejné chování s Python 2.6.5 na Windows Vista.
>t = file('blabla.txt', 'a+')
>t.write("Lorem ipsum dolor sit amet")
>t.seek(0)
>print t.read()
>t.close()
>
>V teto verzi jsem pridal pred read seek. Zde bych ocekaval, ze print
>vypise tentyz text, ktery jsem do souboru zapsal. Skript ale vypise
>vyjimku IOError: [Errno 9] Bad file descriptor
Tohle mi funguje pod Vistama s Python 2.6.5 i s Python 2.7.
On to ale asi není "obyčejný příklad". Problém je asi v tom a+
režimu (stejně se to chová i při w+) a v současném použití .read().
Dokumentace říká:
Note: This function is simply a wrapper for the underlying fread()
C function, and will behave the same in corner cases, such as
whether the EOF value is cached.
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
a díky fread() a zmíněným hraničním případům se to tedy může
jinak chovat. Zkus tohle:
t = open('blabla.txt', 'a+', buffering=0)
t.write("Lorem ipsum dolor sit amet")
## t.seek(0)
print t.read()
t.close()
Jde o přidání parametru buffering=0.
Poznámka: Pro otvírání souboru by se měla používat funkce
open() a ne file(). V Python 3 file() neexistuje.
Petr
Další informace o konferenci Python