Numpy: BUG: PyArray_BufferConverter tidak aman

Dibuat pada 27 Jan 2020  ·  5Komentar  ·  Sumber: numpy/numpy

Fungsi ini:

  1. Menelepon PyObject_GetBuffer
  2. Mengekstrak penunjuk data
  3. Menelepon PyBuffer_Release
  4. Mengembalikan pointer ke pemanggil

PyBuffer_Release menelepon PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view) , yang menurut dokumen mungkin _ "membebaskan semua memori yang terkait dengan view " _, dan tidak memberikan persyaratan bahwa view tetap hidup sebagai selama exporter .

Jadi pada prinsipnya tipe yang mengalokasikan buffer untuk dirinya sendiri dengan cepat di bf_getbuffer dan menghapusnya ketika rilis penggunaan terakhir itu akan menyebabkan use-after-free di numpy.

Saya tidak tahu apakah ada pelaksana protokol buffer yang benar-benar melakukan ini, tetapi saya membaca bahwa mereka diizinkan.

00 - Bug

Semua 5 komentar

Ini aneh. Saya pikir saya ingin jika antarmuka buffer menentukan bahwa sementara bidang buffer struct (seperti langkah, dll.) Dibebaskan oleh PyBuffer_Release memori sebenarnya yang ditunjuk harus dimiliki oleh objek asli (ini akan selesaikan masalah kita dengan _dealloc_cached_buffer_info sangat mengganggu. Saya pikir ini adalah niat dan benar, tapi ...

Sekarang fungsi ini mengembalikan PyArray_Chunk dan bukan buffer, jadi jika Anda membuat klarifikasi yang saya katakan di atas, sebenarnya tidak masalah.

Interpretasi Anda terdengar lebih masuk akal - mungkin permintaan pull terhadap python / cpython akan bijaksana, untuk memperbarui dokumen untuk memberi tahu orang-orang agar tidak menerapkan apa yang saya jelaskan di atas.

Tadinya akan terbuka, tapi kemudian pergi makan siang dulu: https://bugs.python.org/issue39471 Saya mungkin akan mengusulkan perubahan yang sebenarnya pada teks. Jika kita dapat menyetujui interpretasi saya, kita dapat membersihkan kode yang sangat jelek dan sangat lambat dalam implementasi protokol buffer (saat ini memperlambat matematika skalar sebesar 20 +%). (EDIT: Tapi saya kira hanya setelah Python memperbaiki kode ArgParse mereka :()

Itu menambah kejelasan, terima kasih - Saya tidak menyadari bahwa python menggunakan pembacaan yang sama dengan bf_releasebuffer seperti saya.

Sial, saya telah membacanya sebelumnya (dari PEP):

Eksportir perlu mendefinisikan fungsi bf_releasebuffer jika mereka dapat mengalokasikan ulang memori, langkah, bentuk, suboffset, atau variabel format yang mungkin mereka bagikan melalui struct bufferinfo.

Yang dibaca seperti itu valid untuk memberi buffer potongan memori baru :(.

Meskipun: melihat implementasi array (python one), yang dilakukannya hanyalah menggunakannya untuk memastikan bahwa ia menonaktifkan pengubahan ukuran jika ada buffer.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kevinzhai80 picture kevinzhai80  ·  4Komentar

marcocaccin picture marcocaccin  ·  4Komentar

qualiaa picture qualiaa  ·  3Komentar

toddrjen picture toddrjen  ·  4Komentar

MorBilly picture MorBilly  ·  4Komentar