Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 0aca6e86 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

Don't segfault when the uri is an integer

parent 3e1d569e
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!103Don't segfault when the uri is an integer
...@@ -142,20 +142,20 @@ typedef volatile enum { ...@@ -142,20 +142,20 @@ typedef volatile enum {
goto goto_label; \ 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) { \ if (sqlite3_bind_text(stmt, pos, text, -1, 0) != SQLITE_OK) { \
LOG_ERROR("DB", "Failed to bind text %s at pos %d: %s", \ LOG_ERROR("DB", "Failed to bind text %s at pos %d: %s", \
(const char *) text, pos, \ (const char *) text, pos, \
sqlite3_errmsg((sqlite3 *) db)); \ sqlite3_errmsg((sqlite3 *) db)); \
goto error; \ 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) { \ if (sqlite3_bind_int(stmt, pos, integer) != SQLITE_OK) { \
LOG_ERROR("DB", "Failed to bind int %d at pos %d: %s", \ LOG_ERROR("DB", "Failed to bind int %d at pos %d: %s", \
integer, pos, sqlite3_errmsg((sqlite3 *) db));\ integer, pos, sqlite3_errmsg((sqlite3 *) db));\
goto error; \ goto error; \
} }}
#define SQLITE_STEP(db, stmt, code, error) \ #define SQLITE_STEP(db, stmt, code, error) \
if (sqlite3_step(stmt) != code) { \ if (sqlite3_step(stmt) != code) { \
......
...@@ -22,6 +22,7 @@ struct lkt_uri { ...@@ -22,6 +22,7 @@ struct lkt_uri {
size_t id; size_t id;
}; };
bool _allocated; bool _allocated;
bool is_int;
}; };
/* Create and delete URIs */ /* Create and delete URIs */
......
...@@ -31,7 +31,13 @@ database_search_database_init(volatile sqlite3 *db, struct lkt_search *ret) ...@@ -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, safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_STMT_TEMPLATE,
ret->ka_uri.column_name, ret->msg_count, ret->continuation); ret->ka_uri.column_name, ret->msg_count, ret->continuation);
SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); 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; ret->db = db;
return true; return true;
error: error:
...@@ -60,7 +66,13 @@ database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret) ...@@ -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); ret->ka_uri.column_name, ret->msg_count, ret->continuation);
SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); 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, 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; ret->db = db;
return true; return true;
error: error:
...@@ -134,7 +146,13 @@ database_search_queue_init(volatile sqlite3 *db, struct lkt_search *ret) ...@@ -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, safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_STMT_TEMPLATE,
ret->ka_uri.column_name, ret->msg_count, ret->continuation); ret->ka_uri.column_name, ret->msg_count, ret->continuation);
SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); 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; ret->db = db;
return true; return true;
error: error:
......
...@@ -68,11 +68,14 @@ lkt_uri_from(struct lkt_uri *ret, char *const str) ...@@ -68,11 +68,14 @@ lkt_uri_from(struct lkt_uri *ret, char *const str)
if (NULL == __prefix(str, ret)) if (NULL == __prefix(str, ret))
return false; return false;
ret->is_int = false;
if (ret->type == uri_id) { if (ret->type == uri_id) {
errno = 0; errno = 0;
ret->id = strtol(ret->value, NULL, 10); /* Override */ ret->id = strtol(ret->value, NULL, 0); /* Override */
if (errno != 0) if (errno != 0)
return false; return false;
ret->is_int = true;
} }
ret->_allocated = false; ret->_allocated = false;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter