From 0aca6e8613a116f4fc840d5be0fe3e590db5f0ba Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Wed, 27 May 2020 17:34:05 +0200 Subject: [PATCH] Don't segfault when the uri is an integer --- inc/common/macro.h | 8 ++++---- inc/lektor/uri.h | 1 + src/database/find.c | 24 +++++++++++++++++++++--- src/uri.c | 5 ++++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/inc/common/macro.h b/inc/common/macro.h index ff1accde..5fa3a113 100644 --- a/inc/common/macro.h +++ b/inc/common/macro.h @@ -142,20 +142,20 @@ typedef volatile enum { goto goto_label; \ } -#define SQLITE_BIND_TEXT(db, stmt, pos, text, error) \ +#define SQLITE_BIND_TEXT(db, stmt, pos, text, error) { \ if (sqlite3_bind_text(stmt, pos, text, -1, 0) != SQLITE_OK) { \ LOG_ERROR("DB", "Failed to bind text %s at pos %d: %s", \ (const char *) text, pos, \ sqlite3_errmsg((sqlite3 *) db)); \ goto error; \ - } + }} -#define SQLITE_BIND_INT(db, stmt, pos, integer, error) \ +#define SQLITE_BIND_INT(db, stmt, pos, integer, error) { \ if (sqlite3_bind_int(stmt, pos, integer) != SQLITE_OK) { \ LOG_ERROR("DB", "Failed to bind int %d at pos %d: %s", \ integer, pos, sqlite3_errmsg((sqlite3 *) db));\ goto error; \ - } + }} #define SQLITE_STEP(db, stmt, code, error) \ if (sqlite3_step(stmt) != code) { \ diff --git a/inc/lektor/uri.h b/inc/lektor/uri.h index 513091d4..f18e4762 100644 --- a/inc/lektor/uri.h +++ b/inc/lektor/uri.h @@ -22,6 +22,7 @@ struct lkt_uri { size_t id; }; bool _allocated; + bool is_int; }; /* Create and delete URIs */ diff --git a/src/database/find.c b/src/database/find.c index 7e2f5bef..4ec182a5 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -31,7 +31,13 @@ database_search_database_init(volatile sqlite3 *db, struct lkt_search *ret) safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_STMT_TEMPLATE, ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); - SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + if (!ret->ka_uri.is_int) { + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + LOG_DEBUG("DB", "%s", "Uri was a text"); + } else { + SQLITE_BIND_INT(db, ret->stmt, 1, (int) ret->ka_uri.id, error); + LOG_DEBUG("DB", "%s", "Uri was a size_t"); + } ret->db = db; return true; error: @@ -60,7 +66,13 @@ database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret) ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->plt_name, error); - SQLITE_BIND_TEXT(db, ret->stmt, 2, ret->ka_uri.value, error); + if (!ret->ka_uri.is_int) { + SQLITE_BIND_TEXT(db, ret->stmt, 2, ret->ka_uri.value, error); + LOG_DEBUG("DB", "%s", "Uri was a text"); + } else { + SQLITE_BIND_INT(db, ret->stmt, 2, (int) ret->ka_uri.id, error); + LOG_DEBUG("DB", "%s", "Uri was a size_t"); + } ret->db = db; return true; error: @@ -134,7 +146,13 @@ database_search_queue_init(volatile sqlite3 *db, struct lkt_search *ret) safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_STMT_TEMPLATE, ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); - SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + if (!ret->ka_uri.is_int) { + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + LOG_DEBUG("DB", "%s", "Uri was a text"); + } else { + SQLITE_BIND_INT(db, ret->stmt, 1, (int) ret->ka_uri.id, error); + LOG_DEBUG("DB", "%s", "Uri was a size_t"); + } ret->db = db; return true; error: diff --git a/src/uri.c b/src/uri.c index 82364fc9..eaf64887 100644 --- a/src/uri.c +++ b/src/uri.c @@ -68,11 +68,14 @@ lkt_uri_from(struct lkt_uri *ret, char *const str) if (NULL == __prefix(str, ret)) return false; + ret->is_int = false; + if (ret->type == uri_id) { errno = 0; - ret->id = strtol(ret->value, NULL, 10); /* Override */ + ret->id = strtol(ret->value, NULL, 0); /* Override */ if (errno != 0) return false; + ret->is_int = true; } ret->_allocated = false; -- GitLab