[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