2016-07-28 5 views
-1

Если объект является изменяемым, то это возможно, чтобы получить изменяемую буфер не указав второй аргумент 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 поддержка отключена, и программа не запускается с правами root.
Конечно, вещи, подобные памяти, доступны, но я теряю возможность читать память на каждом виртуальном адресе.

ответ

0

Копия необходима. Внутренний буфер bytearray просто не 2 GiB long; если вам нужен буфер 2 GiB, вам нужно будет скопировать данные bytearray в новый буфер.

Если вы каким-то образом вынудили Python обрабатывать буфер как размер, который вы хотите, чтобы он был без копирования, запись на него может испортить память вашего процесса и/или вызвать segfault.

+0

Вы обращали внимание на тег безопасности. Я забыл [включить это] (https://bugs.python.org/issue21831 «они используют версию python, которая уязвима») в моем вопросе. Я получил возможность выполнить произвольный код python на веб-сайте. Но их программа бонусов будет вознаграждаться только в том случае, если я уйду из песочницы, используемой для интерпретатора * (для этого мне нужно выполнить собственный код сборки) *. – user2284570

+0

«Письмо на это испортило бы память вашего процесса». Это то, что я хочу сделать: мне нужно получить доступ к системным вызовам напрямую, чтобы быть в состоянии выйти из изолированной среды уровня os. Для этого требуется возможность выполнить собственную сборку, чтобы я мог обойти песочницу уровня на уровне python * (песочница python не позволяет экранировать песочницу ᴏꜱ-уровня) *. – user2284570

+0

@ user2284570: Ну, если вы пытаетесь использовать эту ошибку, вы сталкиваетесь с дополнительной проблемой, что объекты буфера, созданные с помощью 'buffer', просто не могут быть записаны вообще, передаете ли вы аргумент размера или нет Python-side API, чтобы сделать их доступными для записи. Вы сделали запись через bytearray с 's [1] = 5', а не записью через буферный объект. – user2357112

 Смежные вопросы

  • Нет связанных вопросов^_^