Panduan Variabel

Pengantar

Seperti yang dijelaskan di halaman Ringkasan, Kode Host melakukan panggilan RPC ke Library yang Di-sandbox. Sandbox menghasilkan pemisahan memori antar-proses, sehingga Kode Host tidak dapat langsung mengakses memori di Library yang di-Sandbox.

Untuk memastikan bahwa Kode Host dapat mengakses variabel dan blok memori dalam proses jarak jauh dan untuk menyederhanakan penerapan kode logika utama, SAPI menyediakan serangkaian lengkap class C++. Namun, dalam banyak kasus, Anda juga dapat menggunakan jenis C native.

Kebutuhan akan jenis khusus (Jenis SAPI) muncul saat meneruskan pointer ke jenis sederhana dan blok memori (struktur, array).

Misalnya, saat memanggil fungsi yang mengambil pointer, pointer harus dikonversi menjadi pointer yang sesuai di dalam memori Sandboxed Library. Cuplikan kode di bawah memvisualisasikan skenario ini. Alih-alih array tiga bilangan bulat, objek ::sapi::v::Array<int> dibuat yang kemudian dapat diteruskan dalam panggilan API Sandboxed Library:

int arr[3] = {1, 2, 3};
sapi::v::Array<int> sarr(arr, ABSL_ARRAYSIZE(arr));

Untuk ringkasan komprehensif semua Jenis SAPI yang tersedia, tinjau file header var_*.h dalam kode sumber project SAPI . File header ini menyediakan class dan template yang merepresentasikan berbagai jenis data, misalnya:

  • ::sapi::v::UChar merepresentasikan karakter tidak bertanda yang terkenal
  • ::sapi::v::Array<int> merepresentasikan array bilangan bulat

Jenis SAPI

Bagian ini memperkenalkan tiga Jenis SAPI yang umum terlihat di Kode Host.

Pointer SAPI

Jika fungsi yang akan di-sandbox memerlukan penerusan pointer, pointer ini harus diperoleh dari salah satu metode PtrXXX() di bawah. Metode ini diimplementasikan oleh class variabel SAPI.

Jenis Pointer
::PtrNone() Tidak menyinkronkan memori pokok antara proses Kode Host dan proses Library dengan Sandbox saat diteruskan ke fungsi API dengan sandbox.
::PtrBefore() Menyinkronkan memori objek yang ditujuknya sebelum panggilan fungsi API dengan sandbox dilakukan. Artinya, memori lokal variabel yang ditunjuk akan ditransfer ke proses Sandboxed Library sebelum panggilan dimulai.
::PtrAfter() Menyinkronkan memori objek yang ditujuknya setelah panggilan fungsi API dengan sandbox dilakukan. Artinya, memori jarak jauh dari variabel yang ditunjuk akan ditransfer ke memori proses Kode Host setelah panggilan selesai.
::PtrBoth() Menggabungkan fungsi ::PtrBefore() dan ::PtrAfter().

Dokumentasi untuk penunjuk SAPI dapat ditemukan di sini.

Struktur SAPI

Template ::sapi::v::Struct didokumentasikan di var_struct.h. Template ini menyediakan konstruktor yang dapat digunakan untuk membungkus struktur yang ada. SAPI Struct menyediakan semua metode yang diuraikan dalam Pointer SAPI untuk mendapatkan objek ::sapi::v::Ptr yang dapat digunakan untuk panggilan library sandbox.

Cuplikan kode di bawah menunjukkan struktur yang dimulai, lalu diteruskan ke panggilan fungsi yang di-sandbox dalam zlib example:

sapi::v::Struct<sapi::zlib::z_stream> strm;

if (ret = api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
                             version.PtrBefore(), sizeof(sapi::zlib::z_stream));

Jika struct yang ada berisi pointer, pointer tersebut akan mengarah ke alamat di Sandboxee. Akibatnya, Anda harus mentransfer data Sandboxee sebelum dapat diakses oleh Kode Host.

Array SAPI

Template ::sapi::v::Array didokumentasikan di var_array.h. Template ini menyediakan dua konstruktor, satu yang dapat digunakan untuk membungkus array elemen yang ada, dan yang lainnya untuk membuat array secara dinamis.

Cuplikan kode ini (diambil dari contoh sum) menunjukkan penggunaan konstruktor yang membungkus array yang tidak dimiliki oleh objek ini:

int arr[10];
sapi::v::Array<int> iarr(arr, ABSL_ARRAYSIZE(arr));

Cuplikan kode ini menunjukkan contoh konstruktor yang digunakan untuk membuat array secara dinamis:

sapi::v::Array<uint8_t> buffer(PNG_IMAGE_SIZE(*image.mutable_data()));

Array SAPI menyediakan semua metode yang diuraikan dalam Pointer SAPI untuk mendapatkan objek ::sapi::v::Ptr yang dapat digunakan untuk panggilan library sandbox.