Re: [python] Buffer overflow na Win7?
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 ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] file type v python3
2010/7/15 Petr Přikryl prik...@atlas.cz: t = open('blabla.txt', 'a+', buffering=0) t.write(Lorem ipsum dolor sit amet) ## t.seek(0) print t.read() t.close() Poznámka: Pro otvírání souboru by se měla používat funkce open() a ne file(). V Python 3 file() neexistuje. Diky za zajimavy postreh, o absenci file() v python3 jsem netusil. Vzhledem k tomu, ze me dopredna kompatibilita zajima to budu muset resit. Jak lze v python3 resit nasledujici konstrukci? class test(file): def test(self): return 'test' g = test('pokus.txt', 'w') Mym cilem je vytvorit objekt, ktery dokaze dedit po libovolnem file-like objektu, ktery pouziva jako vlastni cache. Dedicnost resim dynamicky pouzitim type() a definovanim noveho typu v runtime. Zni to na prvni pohled trochu desive, ale myslim, ze pro to mam rozumne duvody. Abych toho ale dosahnul, potrebuji znat typ nebo classu standardniho souboru. Instance objektu nad otevrenym souborem mi pochopitelne nestaci. Diky, Marek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Buffer overflow na Win7?
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 ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] file type v python3
Diky za zajimavy postreh, o absenci file() v python3 jsem netusil. Vzhledem k tomu, ze me dopredna kompatibilita zajima to budu muset resit. Jak lze v python3 resit nasledujici konstrukci? class test(file): def test(self): return 'test' g = test('pokus.txt', 'w') Mym cilem je vytvorit objekt, ktery dokaze dedit po libovolnem file-like objektu, ktery pouziva jako vlastni cache. Dedicnost resim dynamicky pouzitim type() a definovanim noveho typu v runtime. Zni to na prvni pohled trochu desive, ale myslim, ze pro to mam rozumne duvody. Abych toho ale dosahnul, potrebuji znat typ nebo classu standardniho souboru. Instance objektu nad otevrenym souborem mi pochopitelne nestaci. Nemám osobní pracovní zkušenost, ale Python 3 má nový modul io -- viz http://docs.python.org/py3k/library/io.html#module-io Zabudovaná funkce open() je teď alias na io.open(). V tom modulu jsou nějaké bázové třídy... Bude nutné nastudovat. Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] file type v python3
Super, myslim, ze io.FileIO je presne ta trida, na ktere se da v python3 stavet. Diky, Marek 2010/7/15 Petr Přikryl prik...@atlas.cz: Diky za zajimavy postreh, o absenci file() v python3 jsem netusil. Vzhledem k tomu, ze me dopredna kompatibilita zajima to budu muset resit. Jak lze v python3 resit nasledujici konstrukci? class test(file): def test(self): return 'test' g = test('pokus.txt', 'w') Mym cilem je vytvorit objekt, ktery dokaze dedit po libovolnem file-like objektu, ktery pouziva jako vlastni cache. Dedicnost resim dynamicky pouzitim type() a definovanim noveho typu v runtime. Zni to na prvni pohled trochu desive, ale myslim, ze pro to mam rozumne duvody. Abych toho ale dosahnul, potrebuji znat typ nebo classu standardniho souboru. Instance objektu nad otevrenym souborem mi pochopitelne nestaci. Nemám osobní pracovní zkušenost, ale Python 3 má nový modul io -- viz http://docs.python.org/py3k/library/io.html#module-io Zabudovaná funkce open() je teď alias na io.open(). V tom modulu jsou nějaké bázové třídy... Bude nutné nastudovat. Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Buffer overflow na Win7?
No vida. Víc hlav, víc zelí. Fuguje to ;) Michal Molhanec napsal [...] MSDN: When the r+, w+, or a+ access type is specified, both reading and writing are allowed (the file is said to be open for update). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired. tzn. t = file('blabla.txt', 'a+') t.write(Lorem ipsum dolor sit amet) t.flush() print t.read() t.close() [...] Zkousel jsem kde co - no hlavne jste nezkousel precist si MSDN :-) No, já se zase tak moc nedivím. Kdybych dělal hlavně pod Linuxem, tak bych možná nevěděl, co to MSDN je. Ne nadarmo se kdysi říkalo, že až budou Windows jednou hotové, bude to nejlépe dokumentovaný Unix na světě. :) Petr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Buffer overflow na Win7?
Dne Čt 15. července 2010 14:03:35 slush napsal(a): Super, moc diky. Tohle to aspon vysvetluje. 2010/7/15 Michal Molhanec mol-pyt...@seznam.cz: MSDN: When the r+, w+, or a+ access type is specified, both reading and writing are allowed (the file is said to be open for update). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired. Zkousel jsem kde co - no hlavne jste nezkousel precist si MSDN :-) Tak ja v podstate hledal souvislost s pythonem, ne, ze to je vlastnost windows. Kdyz date do google klicove slovo python, MSDN Vam pravdepodobne nevyjede na prvni pozici :-). Jasně, ona to není ani tak vlastnost windows, ale vlastnost standardní C knihovny specifikovaná C standardem. Je pravda, že bych čekal, že to Python vyřeší sám napozadí, leč nestalo se. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Buffer overflow na Win7?
Moc diky vsem za reakce, dost mi to dalo. MSDN znam, ale naposled jsem pod Win vyvijel pred deseti lety. Ted vyvijim pod Linuxem a podporu pro Win resim vlastne jen pro to, ze bych casem vysledek rad submitnul do pypi. Takze se omlouvam za blbe dotazy a neznalost Win prostredi. 2010/7/15 Hynek Fabian hynek.fab...@firma.seznam.cz: 1) Nepouzivat w+ ale presypavat data z jednoho fd do druheho, a pak udelat rename(). Jako bonus mas bezpecny fallback, kdyz se neco pos..., smazes novy soubor a mas nezpracovany, ale aspon konzistentni data. Bohuzel to neni prilis efektivni, pokud mam 2GB soubor a potrebuju po zapisu preseekovat o par byte zpet, pripadne kdyz chci zapsat jen par byte doprostred :). 2) Pokud mermomoci potrebujes r/w pristup, tak je lepsi si cely soubor mmapnout, coz cely ten bufferovaci cirkus v libc obchazi. Bohuzel, mmap resi pouze fyzicky pristup k disku, nejde pouzit pro libovolny file-like object. Podporu pro velmi velke diskove soubory (jako specialni pripad) pres mmap planuji do dalsi verze, kazdopadne musim to nejdriv vyresit obecne tak, aby slo zapisovat/cist/seekovat s cimkoliv, co implementuje read/write/seek/close metody... Kazdopadne s vasi pomoci jsem to zda se vyresil, pokazde, kdyz budu chtit seekovat a predtim jsem zapisoval, zavolam flush(). Podle hrubych testu to vypada, ze to funguje na Linuxu i Windows bez problemu. Ted se jeste hrozim, na co prijdu, az to pustim pod Macem ;-). Marek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Buffer overflow na Win7?
2010/7/15 slush sl...@centrum.cz: Bohuzel, mmap resi pouze fyzicky pristup k disku, nejde pouzit pro libovolny file-like object. Podporu pro velmi velke diskove soubory (jako specialni pripad) pres mmap planuji do dalsi verze, kazdopadne musim to nejdriv vyresit obecne tak, aby slo zapisovat/cist/seekovat s cimkoliv, co implementuje read/write/seek/close metody... To dobrý přístup. Např. některé filesystémy implemetované přes FUSE mmap neumějí. Vývojář někdy ani nemá představu, za jakých situací a na jaké konfiguraci bude jeho program kdo používat :-) Akorát zase tak velkých souborů přes mmap si na 32bitových platfomách neužijete, pokud je chcete mapovat celé :-) Kazdopadne s vasi pomoci jsem to zda se vyresil, pokazde, kdyz budu chtit seekovat a predtim jsem zapisoval, zavolam flush(). Podle hrubych testu to vypada, ze to funguje na Linuxu i Windows bez problemu. Ted se jeste hrozim, na co prijdu, az to pustim pod Macem ;-). Mac OS X je samozřejmě v pohodě (je to Unix). Co funguje na Linuxu a nepoužívá speciality linuxového kernelu, by mělo fungovat i tam. Marek ___ Petr Messner ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python