Skip to content

Commit 4aa7094

Browse files
authored
Merge pull request #13 from superfly/gorbak/merge-equal-values-ub
Fix UB in mergeEqualValues
2 parents b0930e2 + 962eed6 commit 4aa7094

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

core/rs/core/src/config.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use alloc::format;
22

33
use sqlite::{Connection, Context};
44
use sqlite_nostd as sqlite;
5-
use sqlite_nostd::{ResultCode, Value};
5+
use sqlite_nostd::{ManagedStmt, ResultCode, Value};
66

77
use crate::c::crsql_ExtData;
88

@@ -33,7 +33,7 @@ pub extern "C" fn crsql_config_set(
3333

3434
let db = ctx.db_handle();
3535
match insert_config_setting(db, name, value) {
36-
Ok(value) => {
36+
Ok((_stmt, value)) => {
3737
ctx.result_value(value);
3838
}
3939
Err(rc) => {
@@ -48,15 +48,18 @@ fn insert_config_setting(
4848
db: *mut sqlite_nostd::sqlite3,
4949
name: &str,
5050
value: *mut sqlite::value,
51-
) -> Result<*mut sqlite::value, ResultCode> {
51+
) -> Result<(ManagedStmt, *mut sqlite::value), ResultCode> {
5252
let stmt =
5353
db.prepare_v2("INSERT OR REPLACE INTO crsql_master VALUES (?, ?) RETURNING value")?;
5454

5555
stmt.bind_text(1, &format!("config.{name}"), sqlite::Destructor::TRANSIENT)?;
5656
stmt.bind_value(2, value)?;
5757

5858
if let ResultCode::ROW = stmt.step()? {
59-
stmt.column_value(0)
59+
let res = stmt.column_value(0)?;
60+
// Res will get invalidated when stmt gets dropped
61+
// The lifetime of res is not currently checked by the compiler
62+
Ok((stmt, res))
6063
} else {
6164
Err(ResultCode::ERROR)
6265
}

0 commit comments

Comments
 (0)