Skip to content

Commit 84f7541

Browse files
committed
Several other issues fixed
1 parent aa29fd7 commit 84f7541

File tree

5 files changed

+40
-25
lines changed

5 files changed

+40
-25
lines changed

src/network.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ bool network_compute_endpoints (sqlite3_context *context, network_data *data, co
482482
#endif
483483

484484
conn_string_https = cloudsync_string_replace_prefix(conn_string, "sqlitecloud://", "https://");
485+
if (!conn_string_https) goto finalize;
485486

486487
#ifndef SQLITE_WASM_EXTRA_INIT
487488
// set URL: https://UUID.g5.sqlite.cloud:443/chinook.sqlite?apikey=hWDanFolRT9WDK0p54lufNrIyfgLZgtMw6tb6fbPmpo
@@ -794,7 +795,7 @@ int cloudsync_network_send_changes_internal (sqlite3_context *context, int argc,
794795
}
795796

796797
char json_payload[2024];
797-
snprintf(json_payload, sizeof(json_payload), "{\"url\":\"%s\", \"dbVersionMin\":%d, \"dbVersionMax\":%d}", s3_url, db_version, new_db_version);
798+
snprintf(json_payload, sizeof(json_payload), "{\"url\":\"%s\", \"dbVersionMin\":%d, \"dbVersionMax\":%lld}", s3_url, db_version, (long long)new_db_version);
798799

799800
// free res
800801
network_result_cleanup(&res);
@@ -840,7 +841,7 @@ int cloudsync_network_check_internal(sqlite3_context *context, int *pnrows) {
840841
if (seq<0) {sqlite3_result_error(context, "Unable to retrieve seq.", -1); return -1;}
841842

842843
char json_payload[2024];
843-
snprintf(json_payload, sizeof(json_payload), "{\"dbVersion\":%d, \"seq\":%d}", db_version, seq);
844+
snprintf(json_payload, sizeof(json_payload), "{\"dbVersion\":%lld, \"seq\":%d}", (long long)db_version, seq);
844845

845846
// http://uuid.g5.sqlite.cloud/v2/cloudsync/{dbname}/{site_id}/check
846847
NETWORK_RESULT result = network_receive_buffer(netdata, netdata->check_endpoint, netdata->authentication, true, true, json_payload, CLOUDSYNC_HEADER_SQLITECLOUD);
@@ -1001,7 +1002,7 @@ void cloudsync_network_logout (sqlite3_context *context, int argc, sqlite3_value
10011002
// MARK: -
10021003

10031004
int cloudsync_network_register (sqlite3 *db, char **pzErrMsg, void *ctx) {
1004-
const int DEFAULT_FLAGS = SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC;
1005+
const int DEFAULT_FLAGS = SQLITE_UTF8 | SQLITE_INNOCUOUS;
10051006
int rc = SQLITE_OK;
10061007

10071008
rc = sqlite3_create_function(db, "cloudsync_network_init", 1, DEFAULT_FLAGS, ctx, cloudsync_network_init, NULL, NULL);

src/postgresql/database_postgresql.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,13 +1393,13 @@ int database_update_schema_hash (cloudsync_context *data, uint64_t *hash) {
13931393
char sql[1024];
13941394
snprintf(sql, sizeof(sql),
13951395
"INSERT INTO cloudsync_schema_versions (hash, seq) "
1396-
"VALUES (%" PRId64 ", COALESCE((SELECT MAX(seq) FROM cloudsync_schema_versions), 0) + 1) "
1396+
"VALUES (%" PRIu64 ", COALESCE((SELECT MAX(seq) FROM cloudsync_schema_versions), 0) + 1) "
13971397
"ON CONFLICT(hash) DO UPDATE SET "
13981398
"seq = (SELECT COALESCE(MAX(seq), 0) + 1 FROM cloudsync_schema_versions);",
13991399
h);
14001400
rc = database_exec(data, sql);
14011401
if (rc == DBRES_OK && hash) {
1402-
*hash = h;
1402+
if (hash) *hash = h;
14031403
return rc;
14041404
}
14051405

@@ -1537,11 +1537,11 @@ int databasevm_step0 (pg_stmt_t *stmt) {
15371537

15381538
stmt->plan = SPI_prepare(stmt->sql, stmt->nparams, stmt->types);
15391539
if (stmt->plan == NULL) {
1540-
int err = cloudsync_set_error(data, "Unable to prepare SQL statement", DBRES_ERROR);
1541-
return err;
1540+
rc = cloudsync_set_error(data, "Unable to prepare SQL statement", DBRES_ERROR);
1541+
} else {
1542+
SPI_keepplan(stmt->plan);
1543+
stmt->plan_is_prepared = true;
15421544
}
1543-
SPI_keepplan(stmt->plan);
1544-
stmt->plan_is_prepared = true;
15451545
}
15461546
PG_CATCH();
15471547
{
@@ -1762,7 +1762,7 @@ const char *databasevm_sql (dbvm_t *vm) {
17621762
if (!vm) return NULL;
17631763

17641764
pg_stmt_t *stmt = (pg_stmt_t*)vm;
1765-
return stmt->sql;
1765+
return (char *)stmt->sql;
17661766
}
17671767

17681768
// MARK: - BINDING -
@@ -2408,6 +2408,7 @@ char *dbmem_mprintf (const char *format, ...) {
24082408

24092409
// Allocate buffer and format string
24102410
char *result = (char*)malloc(len + 1);
2411+
if (!result) {va_end(args); return NULL;}
24112412
vsnprintf(result, len + 1, format, args);
24122413

24132414
va_end(args);
@@ -2427,6 +2428,7 @@ char *dbmem_vmprintf (const char *format, va_list list) {
24272428

24282429
// Allocate buffer and format string
24292430
char *result = (char*)malloc(len + 1);
2431+
if (!result) return NULL;
24302432
vsnprintf(result, len + 1, format, list);
24312433

24322434
return result;

src/sqlite/cloudsync_changes_sqlite.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ int cloudsync_changesvtab_best_index (sqlite3_vtab *vtab, sqlite3_index_info *id
296296
int idx = constraint->iColumn;
297297
uint8_t op = constraint->op;
298298

299-
const char *colname = (idx > 0) ? COLNAME_FROM_INDEX(idx) : "rowid";
299+
const char *colname = (idx >= 0 && idx < 9) ? COLNAME_FROM_INDEX(idx) : "rowid";
300300
const char *opname = vtab_opname_from_value(op);
301301
if (!opname) continue;
302302

@@ -330,7 +330,7 @@ int cloudsync_changesvtab_best_index (sqlite3_vtab *vtab, sqlite3_index_info *id
330330
if (i > 0) sindex += snprintf(s+sindex, slen-sindex, ", ");
331331

332332
int idx = orderby->iColumn;
333-
const char *colname = COLNAME_FROM_INDEX(idx);
333+
const char *colname = (idx >= 0 && idx < 9) ? COLNAME_FROM_INDEX(idx) : "rowid";
334334
if (!vtab_colname_is_legal(colname)) orderconsumed = 0;
335335

336336
sindex += snprintf(s+sindex, slen-sindex, "%s %s", colname, orderby->desc ? " DESC" : " ASC");

src/sqlite/cloudsync_sqlite.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,12 @@ int dbsync_pk_decode_set_result_callback (void *xdata, int index, int type, int6
290290

291291

292292
void dbsync_pk_decode (sqlite3_context *context, int argc, sqlite3_value **argv) {
293-
const char *pk = (const char *)database_value_text(argv[0]);
293+
const char *pk = (const char *)database_value_blob(argv[0]);
294+
int pk_len = database_value_bytes(argv[0]);
294295
int i = (int)database_value_int(argv[1]);
295296

296297
cloudsync_pk_decode_context xdata = {.context = context, .index = i};
297-
pk_decode_prikey((char *)pk, strlen(pk), dbsync_pk_decode_set_result_callback, &xdata);
298+
pk_decode_prikey((char *)pk, (size_t)pk_len, dbsync_pk_decode_set_result_callback, &xdata);
298299
}
299300

300301
// MARK: -
@@ -452,8 +453,8 @@ int dbsync_update_payload_append (cloudsync_update_payload *payload, sqlite3_val
452453
bool v3_can_be_null = (database_value_type(v3) == SQLITE_NULL);
453454

454455
if ((payload->table_name == NULL) && (!v1_can_be_null)) return SQLITE_NOMEM;
455-
if ((payload->old_values[index] == NULL) && (!v2_can_be_null)) return SQLITE_NOMEM;
456-
if ((payload->new_values[index] == NULL) && (!v3_can_be_null)) return SQLITE_NOMEM;
456+
if ((payload->new_values[index] == NULL) && (!v2_can_be_null)) return SQLITE_NOMEM;
457+
if ((payload->old_values[index] == NULL) && (!v3_can_be_null)) return SQLITE_NOMEM;
457458

458459
return SQLITE_OK;
459460
}
@@ -655,7 +656,7 @@ void dbsync_init (sqlite3_context *context, const char *table, const char *algo,
655656
// returns site_id as TEXT
656657
char buffer[UUID_STR_MAXLEN];
657658
cloudsync_uuid_v7_stringify(cloudsync_siteid(data), buffer, false);
658-
sqlite3_result_text(context, buffer, -1, NULL);
659+
sqlite3_result_text(context, buffer, -1, SQLITE_TRANSIENT);
659660
}
660661

661662
void dbsync_init3 (sqlite3_context *context, int argc, sqlite3_value **argv) {

src/sqlite/database_sqlite.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ int database_create_triggers (cloudsync_context *data, const char *table_name, t
630630
// UPDATE TRIGGER
631631
if (algo == table_algo_crdt_gos) rc = database_create_update_trigger_gos(data, table_name);
632632
else rc = database_create_update_trigger(data, table_name, trigger_when);
633+
if (rc != SQLITE_OK) return rc;
633634

634635
// DELETE TRIGGER
635636
if (algo == table_algo_crdt_gos) rc = database_create_delete_trigger_gos(data, table_name);
@@ -668,7 +669,7 @@ int database_delete_triggers (cloudsync_context *data, const char *table) {
668669
if (rc != SQLITE_OK) goto finalize;
669670

670671
finalize:
671-
if (rc != SQLITE_OK) DEBUG_ALWAYS("dbutils_delete_triggers error %s (%s)", database_errmsg(cloudsync_db(data)), sql);
672+
if (rc != SQLITE_OK) DEBUG_ALWAYS("dbutils_delete_triggers error %s (%s)", database_errmsg(data), sql);
672673
return rc;
673674
}
674675

@@ -694,7 +695,7 @@ bool database_check_schema_hash (cloudsync_context *data, uint64_t hash) {
694695
// the idea is to allow changes on stale peers and to be able to apply these changes on peers with newer schema,
695696
// but it requires alter table operation on augmented tables only add new columns and never drop columns for backward compatibility
696697
char sql[1024];
697-
snprintf(sql, sizeof(sql), "SELECT 1 FROM cloudsync_schema_versions WHERE hash = (%" PRId64 ")", hash);
698+
snprintf(sql, sizeof(sql), "SELECT 1 FROM cloudsync_schema_versions WHERE hash = (%" PRIu64 ")", hash);
698699

699700
int64_t value = 0;
700701
database_select_int(data, sql, &value);
@@ -717,7 +718,7 @@ int database_update_schema_hash (cloudsync_context *data, uint64_t *hash) {
717718

718719
char sql[1024];
719720
snprintf(sql, sizeof(sql), "INSERT INTO cloudsync_schema_versions (hash, seq) "
720-
"VALUES (%" PRId64 ", COALESCE((SELECT MAX(seq) FROM cloudsync_schema_versions), 0) + 1) "
721+
"VALUES (%" PRIu64 ", COALESCE((SELECT MAX(seq) FROM cloudsync_schema_versions), 0) + 1) "
721722
"ON CONFLICT(hash) DO UPDATE SET "
722723
"seq = (SELECT COALESCE(MAX(seq), 0) + 1 FROM cloudsync_schema_versions);", h);
723724
rc = database_exec(data, sql);
@@ -748,7 +749,9 @@ void databasevm_clear_bindings (dbvm_t *vm) {
748749
}
749750

750751
const char *databasevm_sql (dbvm_t *vm) {
751-
return sqlite3_expanded_sql((sqlite3_stmt *)vm);
752+
return sqlite3_sql((sqlite3_stmt *)vm);
753+
// the following allocates memory that needs to be freed
754+
// return sqlite3_expanded_sql((sqlite3_stmt *)vm);
752755
}
753756

754757
static int database_pk_rowid (sqlite3 *db, const char *table_name, char ***names, int *count) {
@@ -762,8 +765,9 @@ static int database_pk_rowid (sqlite3 *db, const char *table_name, char ***names
762765

763766
if (rc == SQLITE_OK) {
764767
char **r = (char**)cloudsync_memory_alloc(sizeof(char*));
765-
if (!r) return SQLITE_NOMEM;
768+
if (!r) {rc = SQLITE_NOMEM; goto cleanup;}
766769
r[0] = cloudsync_string_dup("rowid");
770+
if (!r[0]) {cloudsync_memory_free(r); rc = SQLITE_NOMEM; goto cleanup;}
767771
*names = r;
768772
*count = 1;
769773
} else {
@@ -805,21 +809,28 @@ int database_pk_names (cloudsync_context *data, const char *table_name, char ***
805809
if (rc != SQLITE_OK) goto cleanup;
806810

807811
// allocate array
808-
char **r = (char**)cloudsync_memory_alloc(sizeof(char*) * rows);
812+
char **r = (char**)cloudsync_memory_zeroalloc(sizeof(char*) * rows);
809813
if (!r) {rc = SQLITE_NOMEM; goto cleanup;}
810814

811815
int i = 0;
812816
while ((rc = sqlite3_step(vm)) == SQLITE_ROW) {
813817
const char *txt = (const char*)sqlite3_column_text(vm, 0);
814-
if (!txt) {rc = SQLITE_ERROR; goto cleanup;}
818+
if (!txt) {rc = SQLITE_ERROR; goto cleanup_r;}
815819
r[i] = cloudsync_string_dup(txt);
816-
if (!r[i]) { rc = SQLITE_NOMEM; goto cleanup;}
820+
if (!r[i]) { rc = SQLITE_NOMEM; goto cleanup_r;}
817821
i++;
818822
}
819823
if (rc == SQLITE_DONE) rc = SQLITE_OK;
820824

821825
*names = r;
822826
*count = rows;
827+
goto cleanup;
828+
829+
cleanup_r:
830+
for (int j = 0; j < i; j++) {
831+
if (r[j]) cloudsync_memory_free(r[j]);
832+
}
833+
cloudsync_memory_free(r);
823834

824835
cleanup:
825836
if (vm) sqlite3_finalize(vm);

0 commit comments

Comments
 (0)