Bug fixes

This commit is contained in:
2025-10-16 18:32:28 +02:00
parent 04fcad87f0
commit f288c10b17
3 changed files with 50 additions and 24 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ ifeq ($(OS),Windows_NT)
FLAGS += -lws2_32 -lbcrypt FLAGS += -lws2_32 -lbcrypt
else else
EXT = .out EXT = .out
FLAGS += -lssl -lcrypto -DHTTPS_ENABLED -fsanitize=address,undefined FLAGS += -lssl -lcrypto -DHTTPS_ENABLED
endif endif
all: cweb.h cozisnews$(EXT) all: cweb.h cozisnews$(EXT)
+28 -11
View File
@@ -13753,7 +13753,7 @@ static void value_to_output(StaticOutputBuffer *out, CWEB_VArg arg)
case CWEB_VARG_TYPE_UL : append_to_output_u64(out, arg.ul); break; case CWEB_VARG_TYPE_UL : append_to_output_u64(out, arg.ul); break;
case CWEB_VARG_TYPE_ULL : append_to_output_u64(out, arg.ull); break; case CWEB_VARG_TYPE_ULL : append_to_output_u64(out, arg.ull); break;
case CWEB_VARG_TYPE_F : append_to_output_f64(out, arg.f); break; case CWEB_VARG_TYPE_F : append_to_output_f64(out, arg.f); break;
case CWEB_VARG_TYPE_D : append_to_output_u64(out, arg.d); break; case CWEB_VARG_TYPE_D : append_to_output_f64(out, arg.d); break;
case CWEB_VARG_TYPE_B : append_to_output(out, arg.b ? "true" : "false", arg.b ? 4: 5);break; case CWEB_VARG_TYPE_B : append_to_output(out, arg.b ? "true" : "false", arg.b ? 4: 5);break;
case CWEB_VARG_TYPE_STR : append_to_output(out, arg.str.ptr, arg.str.len); break; case CWEB_VARG_TYPE_STR : append_to_output(out, arg.str.ptr, arg.str.len); break;
case CWEB_VARG_TYPE_HASH : append_to_output(out, arg.hash.data, strlen(arg.hash.data)); break; case CWEB_VARG_TYPE_HASH : append_to_output(out, arg.hash.data, strlen(arg.hash.data)); break;
@@ -14023,7 +14023,7 @@ static Session *lookup_session_slot(SessionStorage *storage, CWEB_String sess, b
if (sess.len != SESS_TOKEN_SIZE) if (sess.len != SESS_TOKEN_SIZE)
return NULL; return NULL;
uint64_t key; uint64_t key = 0;
if (sess.len < (int) (2 * sizeof(key))) if (sess.len < (int) (2 * sizeof(key)))
return NULL; return NULL;
for (int i = 0; i < (int) sizeof(key); i++) { for (int i = 0; i < (int) sizeof(key); i++) {
@@ -14031,8 +14031,8 @@ static Session *lookup_session_slot(SessionStorage *storage, CWEB_String sess, b
int high = sess.ptr[(i << 1) | 0]; int high = sess.ptr[(i << 1) | 0];
int low = sess.ptr[(i << 1) | 1]; int low = sess.ptr[(i << 1) | 1];
if (!is_hex_digit(sess.ptr[i+0]) || if (!is_hex_digit(high) ||
!is_hex_digit(sess.ptr[i+1])) !is_hex_digit(low))
return NULL; return NULL;
key <<= 4; key <<= 4;
@@ -14106,7 +14106,7 @@ static int delete_session(SessionStorage *storage, CWEB_String sess)
return -1; return -1;
Session *found = lookup_session_slot(storage, sess, false); Session *found = lookup_session_slot(storage, sess, false);
if (found == NULL) if (found == NULL)
return false; return -1;
ASSERT(found->user >= 0); ASSERT(found->user >= 0);
found->user = -2; found->user = -2;
storage->count--; storage->count--;
@@ -14230,15 +14230,20 @@ static int sqlite3utils_prepare(SQLiteCache *cache, sqlite3_stmt **pstmt, char *
cache->items[i].len = fmtlen; cache->items[i].len = fmtlen;
cache->items[i].stmt = stmt; cache->items[i].stmt = stmt;
} }
sqlite3_stmt *stmt = cache->items[i].stmt; sqlite3_stmt *stmt = cache->items[i].stmt;
*pstmt = stmt; *pstmt = stmt;
return SQLITE_OK; return SQLITE_OK;
} }
static void dump_sql(char *fmt, CWEB_VArgs args); // TODO: remove
static int sqlite3utils_prepare_and_bind_impl(SQLiteCache *cache, static int sqlite3utils_prepare_and_bind_impl(SQLiteCache *cache,
sqlite3_stmt **pstmt, char *fmt, CWEB_VArgs args) sqlite3_stmt **pstmt, char *fmt, CWEB_VArgs args)
{ {
dump_sql(fmt, args); // TODO: remove
sqlite3_stmt *stmt; sqlite3_stmt *stmt;
int ret = sqlite3utils_prepare(cache, &stmt, fmt, strlen(fmt)); int ret = sqlite3utils_prepare(cache, &stmt, fmt, strlen(fmt));
if (ret != SQLITE_OK) if (ret != SQLITE_OK)
@@ -14256,17 +14261,22 @@ static int sqlite3utils_prepare_and_bind_impl(SQLiteCache *cache,
case CWEB_VARG_TYPE_SS : ret = sqlite3_bind_int (stmt, i+1, arg.ss); break; case CWEB_VARG_TYPE_SS : ret = sqlite3_bind_int (stmt, i+1, arg.ss); break;
case CWEB_VARG_TYPE_SI : ret = sqlite3_bind_int (stmt, i+1, arg.si); break; case CWEB_VARG_TYPE_SI : ret = sqlite3_bind_int (stmt, i+1, arg.si); break;
case CWEB_VARG_TYPE_SL : ret = sqlite3_bind_int64 (stmt, i+1, arg.sl); break; case CWEB_VARG_TYPE_SL : ret = sqlite3_bind_int64 (stmt, i+1, arg.sl); break;
case CWEB_VARG_TYPE_SLL : ret = sqlite3_bind_int (stmt, i+1, arg.sll); break; case CWEB_VARG_TYPE_SLL : ret = sqlite3_bind_int64 (stmt, i+1, arg.sll); break;
case CWEB_VARG_TYPE_UC : ret = sqlite3_bind_int (stmt, i+1, arg.uc); break; case CWEB_VARG_TYPE_UC : ret = sqlite3_bind_int (stmt, i+1, arg.uc); break;
case CWEB_VARG_TYPE_US : ret = sqlite3_bind_int (stmt, i+1, arg.us); break; case CWEB_VARG_TYPE_US : ret = sqlite3_bind_int (stmt, i+1, arg.us); break;
case CWEB_VARG_TYPE_UI : ret = sqlite3_bind_int64 (stmt, i+1, arg.ui); break; case CWEB_VARG_TYPE_UI : ret = sqlite3_bind_int64 (stmt, i+1, arg.ui); break;
case CWEB_VARG_TYPE_UL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ul); break; case CWEB_VARG_TYPE_UL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ul); break;
case CWEB_VARG_TYPE_ULL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ull); break; case CWEB_VARG_TYPE_ULL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ull); break; // TODO: overflow?
case CWEB_VARG_TYPE_F : ret = sqlite3_bind_double(stmt, i+1, arg.f); break; case CWEB_VARG_TYPE_F : ret = sqlite3_bind_double(stmt, i+1, arg.f); break;
case CWEB_VARG_TYPE_D : ret = sqlite3_bind_double(stmt, i+1, arg.d); break; case CWEB_VARG_TYPE_D : ret = sqlite3_bind_double(stmt, i+1, arg.d); break;
case CWEB_VARG_TYPE_B : ret = sqlite3_bind_int (stmt, i+1, arg.b); break; case CWEB_VARG_TYPE_B : ret = sqlite3_bind_int (stmt, i+1, arg.b); break;
case CWEB_VARG_TYPE_STR : ret = sqlite3_bind_text (stmt, i+1, arg.str.ptr, arg.str.len, NULL); break; case CWEB_VARG_TYPE_STR : ret = sqlite3_bind_text (stmt, i+1, arg.str.ptr, arg.str.len, NULL); break;
case CWEB_VARG_TYPE_HASH: ret = sqlite3_bind_text (stmt, i+1, arg.hash.data, -1, NULL); break;
case CWEB_VARG_TYPE_HASH:
CWEB_TRACE("%s: binding hash [%s]", __func__, arg.hash.data);
ret = sqlite3_bind_text (stmt, i+1, arg.hash.data, strlen(arg.hash.data), SQLITE_TRANSIENT);
break;
default: default:
ASSERT(0); // TODO ASSERT(0); // TODO
break; break;
@@ -14414,7 +14424,7 @@ int cweb_next_query_row_impl(CWEB_QueryResult *res, CWEB_VArgs args)
case CWEB_VARG_TYPE_PLL: case CWEB_VARG_TYPE_PLL:
{ {
int64_t x = sqlite3_column_int64(res->handle, i); int64_t x = sqlite3_column_int64(res->handle, i);
*args.ptr[i].pll = (int) x; *args.ptr[i].pll = x;
} }
break; break;
@@ -14428,7 +14438,7 @@ int cweb_next_query_row_impl(CWEB_QueryResult *res, CWEB_VArgs args)
case CWEB_VARG_TYPE_PD: case CWEB_VARG_TYPE_PD:
{ {
double x = sqlite3_column_double(res->handle, i); double x = sqlite3_column_double(res->handle, i);
*args.ptr[i].pf = (float) x; *args.ptr[i].pd = x;
} }
break; break;
@@ -14443,6 +14453,13 @@ int cweb_next_query_row_impl(CWEB_QueryResult *res, CWEB_VArgs args)
case CWEB_VARG_TYPE_PHASH: case CWEB_VARG_TYPE_PHASH:
{ {
if (sqlite3_column_type(res->handle, i) != SQLITE_TEXT) {
CWEB_TRACE("%s couldn't bind to hash argument due to the column not being a string", __func__);
sqlite3_reset(res->handle);
res->handle = NULL;
return -1;
}
char *ptr = sqlite3_column_text(res->handle, i); char *ptr = sqlite3_column_text(res->handle, i);
int len = sqlite3_column_bytes(res->handle, i); int len = sqlite3_column_bytes(res->handle, i);
@@ -15217,7 +15234,7 @@ void cweb_respond_template_impl(CWEB_Request *req, int status, CWEB_String templ
case CWEB_VARG_TYPE_SL : wl_push_s64(rt, arg.sl); break; case CWEB_VARG_TYPE_SL : wl_push_s64(rt, arg.sl); break;
case CWEB_VARG_TYPE_SLL: wl_push_s64(rt, arg.sll); break; case CWEB_VARG_TYPE_SLL: wl_push_s64(rt, arg.sll); break;
case CWEB_VARG_TYPE_F : wl_push_f64(rt, arg.f); break; case CWEB_VARG_TYPE_F : wl_push_f64(rt, arg.f); break;
case CWEB_VARG_TYPE_D : wl_push_s64(rt, arg.d); break; case CWEB_VARG_TYPE_D : wl_push_f64(rt, arg.d); break;
case CWEB_VARG_TYPE_B : if (arg.b) wl_push_true(rt); else wl_push_false(rt); break; case CWEB_VARG_TYPE_B : if (arg.b) wl_push_true(rt); else wl_push_false(rt); break;
case CWEB_VARG_TYPE_STR: wl_push_str(rt, (WL_String) { arg.str.ptr, arg.str.len }); break; case CWEB_VARG_TYPE_STR: wl_push_str(rt, (WL_String) { arg.str.ptr, arg.str.len }); break;
default:break; default:break;
+20 -11
View File
@@ -259,7 +259,7 @@ static void value_to_output(StaticOutputBuffer *out, CWEB_VArg arg)
case CWEB_VARG_TYPE_UL : append_to_output_u64(out, arg.ul); break; case CWEB_VARG_TYPE_UL : append_to_output_u64(out, arg.ul); break;
case CWEB_VARG_TYPE_ULL : append_to_output_u64(out, arg.ull); break; case CWEB_VARG_TYPE_ULL : append_to_output_u64(out, arg.ull); break;
case CWEB_VARG_TYPE_F : append_to_output_f64(out, arg.f); break; case CWEB_VARG_TYPE_F : append_to_output_f64(out, arg.f); break;
case CWEB_VARG_TYPE_D : append_to_output_u64(out, arg.d); break; case CWEB_VARG_TYPE_D : append_to_output_f64(out, arg.d); break;
case CWEB_VARG_TYPE_B : append_to_output(out, arg.b ? "true" : "false", arg.b ? 4: 5);break; case CWEB_VARG_TYPE_B : append_to_output(out, arg.b ? "true" : "false", arg.b ? 4: 5);break;
case CWEB_VARG_TYPE_STR : append_to_output(out, arg.str.ptr, arg.str.len); break; case CWEB_VARG_TYPE_STR : append_to_output(out, arg.str.ptr, arg.str.len); break;
case CWEB_VARG_TYPE_HASH : append_to_output(out, arg.hash.data, strlen(arg.hash.data)); break; case CWEB_VARG_TYPE_HASH : append_to_output(out, arg.hash.data, strlen(arg.hash.data)); break;
@@ -529,7 +529,7 @@ static Session *lookup_session_slot(SessionStorage *storage, CWEB_String sess, b
if (sess.len != SESS_TOKEN_SIZE) if (sess.len != SESS_TOKEN_SIZE)
return NULL; return NULL;
uint64_t key; uint64_t key = 0;
if (sess.len < (int) (2 * sizeof(key))) if (sess.len < (int) (2 * sizeof(key)))
return NULL; return NULL;
for (int i = 0; i < (int) sizeof(key); i++) { for (int i = 0; i < (int) sizeof(key); i++) {
@@ -537,8 +537,8 @@ static Session *lookup_session_slot(SessionStorage *storage, CWEB_String sess, b
int high = sess.ptr[(i << 1) | 0]; int high = sess.ptr[(i << 1) | 0];
int low = sess.ptr[(i << 1) | 1]; int low = sess.ptr[(i << 1) | 1];
if (!is_hex_digit(sess.ptr[i+0]) || if (!is_hex_digit(high) ||
!is_hex_digit(sess.ptr[i+1])) !is_hex_digit(low))
return NULL; return NULL;
key <<= 4; key <<= 4;
@@ -612,7 +612,7 @@ static int delete_session(SessionStorage *storage, CWEB_String sess)
return -1; return -1;
Session *found = lookup_session_slot(storage, sess, false); Session *found = lookup_session_slot(storage, sess, false);
if (found == NULL) if (found == NULL)
return false; return -1;
ASSERT(found->user >= 0); ASSERT(found->user >= 0);
found->user = -2; found->user = -2;
storage->count--; storage->count--;
@@ -736,6 +736,7 @@ static int sqlite3utils_prepare(SQLiteCache *cache, sqlite3_stmt **pstmt, char *
cache->items[i].len = fmtlen; cache->items[i].len = fmtlen;
cache->items[i].stmt = stmt; cache->items[i].stmt = stmt;
} }
sqlite3_stmt *stmt = cache->items[i].stmt; sqlite3_stmt *stmt = cache->items[i].stmt;
*pstmt = stmt; *pstmt = stmt;
@@ -762,17 +763,18 @@ static int sqlite3utils_prepare_and_bind_impl(SQLiteCache *cache,
case CWEB_VARG_TYPE_SS : ret = sqlite3_bind_int (stmt, i+1, arg.ss); break; case CWEB_VARG_TYPE_SS : ret = sqlite3_bind_int (stmt, i+1, arg.ss); break;
case CWEB_VARG_TYPE_SI : ret = sqlite3_bind_int (stmt, i+1, arg.si); break; case CWEB_VARG_TYPE_SI : ret = sqlite3_bind_int (stmt, i+1, arg.si); break;
case CWEB_VARG_TYPE_SL : ret = sqlite3_bind_int64 (stmt, i+1, arg.sl); break; case CWEB_VARG_TYPE_SL : ret = sqlite3_bind_int64 (stmt, i+1, arg.sl); break;
case CWEB_VARG_TYPE_SLL : ret = sqlite3_bind_int (stmt, i+1, arg.sll); break; case CWEB_VARG_TYPE_SLL : ret = sqlite3_bind_int64 (stmt, i+1, arg.sll); break;
case CWEB_VARG_TYPE_UC : ret = sqlite3_bind_int (stmt, i+1, arg.uc); break; case CWEB_VARG_TYPE_UC : ret = sqlite3_bind_int (stmt, i+1, arg.uc); break;
case CWEB_VARG_TYPE_US : ret = sqlite3_bind_int (stmt, i+1, arg.us); break; case CWEB_VARG_TYPE_US : ret = sqlite3_bind_int (stmt, i+1, arg.us); break;
case CWEB_VARG_TYPE_UI : ret = sqlite3_bind_int64 (stmt, i+1, arg.ui); break; case CWEB_VARG_TYPE_UI : ret = sqlite3_bind_int64 (stmt, i+1, arg.ui); break;
case CWEB_VARG_TYPE_UL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ul); break; case CWEB_VARG_TYPE_UL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ul); break;
case CWEB_VARG_TYPE_ULL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ull); break; case CWEB_VARG_TYPE_ULL : ret = sqlite3_bind_int64 (stmt, i+1, arg.ull); break; // TODO: overflow?
case CWEB_VARG_TYPE_F : ret = sqlite3_bind_double(stmt, i+1, arg.f); break; case CWEB_VARG_TYPE_F : ret = sqlite3_bind_double(stmt, i+1, arg.f); break;
case CWEB_VARG_TYPE_D : ret = sqlite3_bind_double(stmt, i+1, arg.d); break; case CWEB_VARG_TYPE_D : ret = sqlite3_bind_double(stmt, i+1, arg.d); break;
case CWEB_VARG_TYPE_B : ret = sqlite3_bind_int (stmt, i+1, arg.b); break; case CWEB_VARG_TYPE_B : ret = sqlite3_bind_int (stmt, i+1, arg.b); break;
case CWEB_VARG_TYPE_STR : ret = sqlite3_bind_text (stmt, i+1, arg.str.ptr, arg.str.len, NULL); break; case CWEB_VARG_TYPE_STR : ret = sqlite3_bind_text (stmt, i+1, arg.str.ptr, arg.str.len, NULL); break;
case CWEB_VARG_TYPE_HASH: ret = sqlite3_bind_text (stmt, i+1, arg.hash.data, -1, NULL); break; case CWEB_VARG_TYPE_HASH: ret = sqlite3_bind_text (stmt, i+1, arg.hash.data, strlen(arg.hash.data), SQLITE_TRANSIENT); break;
default: default:
ASSERT(0); // TODO ASSERT(0); // TODO
break; break;
@@ -920,7 +922,7 @@ int cweb_next_query_row_impl(CWEB_QueryResult *res, CWEB_VArgs args)
case CWEB_VARG_TYPE_PLL: case CWEB_VARG_TYPE_PLL:
{ {
int64_t x = sqlite3_column_int64(res->handle, i); int64_t x = sqlite3_column_int64(res->handle, i);
*args.ptr[i].pll = (int) x; *args.ptr[i].pll = x;
} }
break; break;
@@ -934,7 +936,7 @@ int cweb_next_query_row_impl(CWEB_QueryResult *res, CWEB_VArgs args)
case CWEB_VARG_TYPE_PD: case CWEB_VARG_TYPE_PD:
{ {
double x = sqlite3_column_double(res->handle, i); double x = sqlite3_column_double(res->handle, i);
*args.ptr[i].pf = (float) x; *args.ptr[i].pd = x;
} }
break; break;
@@ -949,6 +951,13 @@ int cweb_next_query_row_impl(CWEB_QueryResult *res, CWEB_VArgs args)
case CWEB_VARG_TYPE_PHASH: case CWEB_VARG_TYPE_PHASH:
{ {
if (sqlite3_column_type(res->handle, i) != SQLITE_TEXT) {
CWEB_TRACE("%s couldn't bind to hash argument due to the column not being a string", __func__);
sqlite3_reset(res->handle);
res->handle = NULL;
return -1;
}
char *ptr = sqlite3_column_text(res->handle, i); char *ptr = sqlite3_column_text(res->handle, i);
int len = sqlite3_column_bytes(res->handle, i); int len = sqlite3_column_bytes(res->handle, i);
@@ -1723,7 +1732,7 @@ void cweb_respond_template_impl(CWEB_Request *req, int status, CWEB_String templ
case CWEB_VARG_TYPE_SL : wl_push_s64(rt, arg.sl); break; case CWEB_VARG_TYPE_SL : wl_push_s64(rt, arg.sl); break;
case CWEB_VARG_TYPE_SLL: wl_push_s64(rt, arg.sll); break; case CWEB_VARG_TYPE_SLL: wl_push_s64(rt, arg.sll); break;
case CWEB_VARG_TYPE_F : wl_push_f64(rt, arg.f); break; case CWEB_VARG_TYPE_F : wl_push_f64(rt, arg.f); break;
case CWEB_VARG_TYPE_D : wl_push_s64(rt, arg.d); break; case CWEB_VARG_TYPE_D : wl_push_f64(rt, arg.d); break;
case CWEB_VARG_TYPE_B : if (arg.b) wl_push_true(rt); else wl_push_false(rt); break; case CWEB_VARG_TYPE_B : if (arg.b) wl_push_true(rt); else wl_push_false(rt); break;
case CWEB_VARG_TYPE_STR: wl_push_str(rt, (WL_String) { arg.str.ptr, arg.str.len }); break; case CWEB_VARG_TYPE_STR: wl_push_str(rt, (WL_String) { arg.str.ptr, arg.str.len }); break;
default:break; default:break;