| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SQL_SANDBOXED_VFS_FILE_H_ |
| #define SQL_SANDBOXED_VFS_FILE_H_ |
| |
| #include"base/component_export.h" |
| #include"base/memory/raw_ptr.h" |
| #include"base/memory/raw_ptr_exclusion.h" |
| #include"third_party/sqlite/sqlite3.h" |
| |
| namespace sql{ |
| |
| // SQLite VFS file interface of an vfs file that works in a sandboxed process. |
| class COMPONENT_EXPORT(SQL)SandboxedVfsFile{ |
| public: |
| SandboxedVfsFile(); |
| virtual~SandboxedVfsFile(); |
| |
| // Bind the `vfs_file` to an instance in the given sqlite3_file buffer. |
| staticvoidBindSandboxedFile(SandboxedVfsFile* vfs_file, |
| sqlite3_file& buffer); |
| |
| // Extracts the instance bridged to the given SQLite VFS file. |
| staticSandboxedVfsFile&FromSqliteFile(sqlite3_file& sqlite_file); |
| |
| // sqlite3_file implementation. |
| virtualintClose()=0; |
| virtualintRead(void* buffer,int size, sqlite3_int64 offset)=0; |
| virtualintWrite(constvoid* buffer,int size, sqlite3_int64 offset)=0; |
| virtualintTruncate(sqlite3_int64 size)=0; |
| virtualintSync(int flags)=0; |
| virtualintFileSize(sqlite3_int64* result_size)=0; |
| virtualintLock(int mode)=0; |
| virtualintUnlock(int mode)=0; |
| virtualintCheckReservedLock(int* has_reserved_lock)=0; |
| virtualintFileControl(int opcode,void* data)=0; |
| virtualintSectorSize()=0; |
| virtualintDeviceCharacteristics()=0; |
| virtualintShmMap(int page_index, |
| int page_size, |
| int extend_file_if_needed, |
| voidvolatile** result)=0; |
| virtualintShmLock(int offset,int size,int flags)=0; |
| virtualvoidShmBarrier()=0; |
| virtualintShmUnmap(int also_delete_file)=0; |
| virtualintFetch(sqlite3_int64 offset,int size,void** result)=0; |
| virtualintUnfetch(sqlite3_int64 offset,void* fetch_result)=0; |
| }; |
| |
| // sqlite3_file "subclass" that bridges to a SandboxedVfsFile instance. |
| structSandboxedVfsFileSqliteBridge{ |
| sqlite3_file sqlite_file; |
| // `sandboxed_vfs_file` is not a raw_ptr<SandboxedVfsFile>, because |
| // reinterpret_cast of uninitialized memory to raw_ptr can cause ref-counting |
| // mismatch. |
| RAW_PTR_EXCLUSIONSandboxedVfsFile* sandboxed_vfs_file; |
| |
| staticSandboxedVfsFileSqliteBridge&FromSqliteFile( |
| sqlite3_file& sqlite_file); |
| }; |
| |
| }// namespace sql |
| |
| #endif// SQL_SANDBOXED_VFS_FILE_H_ |