#2272·libsql

libsql: `Connection::authorizer` 保留指向 `Connection` 的原始指针,导致在事务持有克隆时,原始连接被释放时堆溢出

作者: dywzju09-blip创建于 2026年8月14日更新于 2026年9月13日

#[derive(Clone)] pub struct Connection { pub(crate) raw: *mut ffi::sqlite3, drop_ref: Arc<()>, authorizer: Arc<RwLock<Option>>, } let (callback, user_data) = match hook { Some() => { let callback = authorizer_callback as unsafe extern "C" fn(, _, _, _, _, _) -> _; let user_data = self as *const Connection as *mut ::std::os::raw::c_void; (Some(callback), user_data) None => (None, std::ptr::null_mut()), }; pub fn disconnect(&mut self) { if Arc::get_mut(&mut self.drop_ref).is_some() { unsafe { libsql_sys::ffi::sqlite3_close_v2(self.raw) }; } } unsafe extern "C" fn authorizer_callback( user_data: *mut ::std::os::raw::c_void, code: ::std::os::raw::c_int, arg1: *const ::std::os::raw::c_char, arg2: *const ::std::os::raw::c_char, database_name: *const ::std::os::raw::c_char, accessor: *const ::std::os::raw::c_char), -> ::std::os::raw::c_int { let conn = user_data as *const Connection; let hook = unsafe { (*conn).authorizer.read() }; async fn transaction(&self, tx_behavior: TransactionBehavior) -> Result { let tx = crate::local::Transaction::begin(self.conn.clone(), tx_behavior)?; Ok(Transaction { inner: Box::new(LibsqlTx(Some(tx))), conn: self.clone(), })

内容来源: tursodatabase/libsql