2016-07-28 1 views
-1

오브젝트는 변경 가능한 다음은이 같은 제 (내장 함수가) buffer()의 두 번째 인수를 지정하지 않음으로써 수정 가능한 버퍼를 얻을 수 있다면 : 내 경우,size 인수가 설정되었을 때 복사하지 않고 buffer()를 쓸 수있게 할 수 있습니까?

>>> s = bytearray(1000000) # a million zeroed bytes 
>>> t = buffer(s, 1)   # slice cuts off the first byte 
>>> s[1] = 5     # set the second element in s 
>>> t[0]      # which is now also the first element in t! 
'\x05' 

그러나 , 크기 매개 변수로 0x7fffffff을 지정해야합니다. 이 경우 :

>>> b = buffer(bytearray('a'), 1,0x7fffffff) 

how to make b writeable without copying it’s data? 내 경우에는 _ctypes 지원이 비활성화되고 프로그램은 루트로 실행되지 않습니다.
물론 memoryview와 같은 것이 있지만 모든 가상 주소에서 메모리를 읽을 가능성이 느립니다.

답변

0

복사가 필요합니다. bytearray의 내부 버퍼는 단순히 2 GiB가 아닙니다. 2 GiB 버퍼를 원한다면, bytearray의 데이터를 새로운 버퍼에 복사해야합니다.

복사를하지 않고도 원하는 크기로 버퍼를 처리하도록하려면 파이썬이 버퍼를 쓰면 프로세스의 메모리가 손상되거나 세그 폴트가 발생할 수 있습니다.

+0

보안 태그에주의를 기울였습니까? 내 질문에 [이 포함] (https://bugs.python.org/issue21831 "그들은 취약한 비단뱀의 버전을 사용합니다) 잊어 버렸습니다." 필자는 웹 사이트에서 임의의 파이썬 코드를 실행할 수있는 가능성을 얻었다. 하지만 해당 현상금 프로그램은 인터프리터에 사용되는 샌드 박스 (* 네이티브 어셈블리 코드를 실행해야 함) *를 피할 경우에만 보상을받습니다. – user2284570

+0

'쓰기로 프로세스의 메모리가 손상됩니다. 이것이 내가하고 싶은 일입니다 : OS 레벨 샌드 박스를 벗어날 수있는 시스템 호출에 직접 액세스해야합니다. 파이썬 수준의 샌드 박스 * (파이썬 샌드 박스는 ᴏꜱ 수준의 샌드 박스를 벗어나지 못하게)를 우회 할 수 있도록 네이티브 어셈블리를 실행할 수 있어야합니다. – user2284570

+0

@ user2284570 : 글쎄, 당신이 그 버그를 악용하려고한다면, 여러분은 'buffer'로 생성 된 버퍼 객체가 크기 인자를 전달하는지 여부와 관계없이 쓰기가 불가능하다는 추가적인 문제에 봉착하게됩니다. 쓰기가 가능한 Python 측 API. 버퍼 객체를 통한 쓰기가 아닌's [1] = 5'를 사용하여 bytearray를 통해 글을 작성했습니다. – user2357112

관련 문제