From 3890d2038d8226f6d244100545d678c90e75257d Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 23 Jul 2026 18:16:53 +0300 Subject: [PATCH] db_sync: add missing ERROR/WARN logs to all error branches - db_record_insert: error logs for si_prep failures (SELECT, INSERT, cascade SELECT/UPDATE) - si_parse_record: WARN logs for truncated header, data/sig overrun - db_chain_hash_at: ERROR logs for missing row, corrupted blob - db_prev_chain_hash: ERROR log for si_prep failure - db_cascade_from: ERROR logs for si_prep failures --- src/db_sync.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/db_sync.c b/src/db_sync.c index edf64632..7b7b56cd 100644 --- a/src/db_sync.c +++ b/src/db_sync.c @@ -259,9 +259,9 @@ static int db_chain_hash_at(struct DB_SYNC_INSTANCE* si, uint32_t pos, uint8_t o return -1; } sqlite3_bind_int64(stmt, 1, (sqlite3_int64)pos); - if (sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); return -1; } + if (sqlite3_step(stmt) != SQLITE_ROW) { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "chain_hash_at no row pos=%u tbl=%s", pos, SI_TBL(si)); sqlite3_finalize(stmt); return -1; } const void* b = sqlite3_column_blob(stmt, 0); - if (!b || sqlite3_column_bytes(stmt, 0) < 32) { sqlite3_finalize(stmt); return -1; } + if (!b || sqlite3_column_bytes(stmt, 0) < 32) { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "chain_hash_at blob too small pos=%u tbl=%s", pos, SI_TBL(si)); sqlite3_finalize(stmt); return -1; } memcpy(out, b, 32); sqlite3_finalize(stmt); return 0; @@ -288,8 +288,9 @@ static int db_prev_chain_hash(struct DB_SYNC_INSTANCE* si, uint64_t ts, const ui "SELECT chain_hash FROM \"%s\"" " WHERE timestamp?1" " OR (timestamp=?1 AND author_signature>?2)" " ORDER BY timestamp, author_signature") != SQLITE_OK) - { sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } + { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_record_insert cascade SELECT prep: %s", sqlite3_errmsg(db)); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } sqlite3_bind_int64(sel, 1, (sqlite3_int64)ts); sqlite3_bind_blob(sel, 2, author_sig, DB_SIG_SIZE, SQLITE_STATIC); @@ -482,7 +483,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si, if (si_prep(si, &upd, "UPDATE \"%s\" SET chain_hash=?" " WHERE timestamp=? AND author_signature=?") != SQLITE_OK) - { sqlite3_finalize(sel); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } + { DEBUG_ERROR(DEBUG_CATEGORY_DB_SYNC, "db_record_insert cascade UPDATE prep: %s", sqlite3_errmsg(db)); sqlite3_finalize(sel); sqlite3_exec(db, "ROLLBACK", NULL, NULL, NULL); return -1; } uint8_t rch[32]; memcpy(rch, ch, 32); while (sqlite3_step(sel) == SQLITE_ROW) { @@ -890,20 +891,20 @@ static int si_parse_record(const uint8_t** pp, const uint8_t* end, uint32_t* rdlen, const uint8_t** rdata, const uint8_t** rsig, int* rsiglen) { - if (*pp + 28 > end) return -1; // 8+8+8+4 = 28 + if (*pp + 28 > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: truncated header, need 28 have %td", end - *pp); return -1; } *rid = *(uint64_t*)*pp; *pp += 8; *rts = *(uint64_t*)*pp; *pp += 8; *rauthor = *(uint64_t*)*pp; *pp += 8; *rdlen = *(uint32_t*)*pp; *pp += 4; - if (*pp + *rdlen > end) return -1; + if (*pp + *rdlen > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: data overrun dlen=%u have=%td", *rdlen, end - *pp); return -1; } *rdata = (*rdlen > 0) ? *pp : NULL; *pp += *rdlen; - if (*pp + 1 > end) return -1; + if (*pp + 1 > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: sig_len overrun"); return -1; } *rsiglen = (int)(*(*pp)++); if (*rsiglen > 0) { - if (*pp + *rsiglen > end) return -1; + if (*pp + *rsiglen > end) { DEBUG_WARN(DEBUG_CATEGORY_DB_SYNC, "si_parse_record: sig data overrun slen=%d have=%td", *rsiglen, end - *pp); return -1; } *rsig = *pp; *pp += *rsiglen; } else {