Re: [python] Buffer overflow na Win7?

2010-07-15 Tema obsahu Petr Přikryl

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-07-15 Tema obsahu slush
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?

2010-07-15 Tema obsahu Petr Přikryl

 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

2010-07-15 Tema obsahu Petr Přikryl

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

2010-07-15 Tema obsahu slush
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?

2010-07-15 Tema obsahu Petr Přikryl

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?

2010-07-15 Tema obsahu Michal Molhanec
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?

2010-07-15 Tema obsahu slush
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-07-15 Tema obsahu Petr Messner
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