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 {
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) { \
......
......@@ -22,6 +22,7 @@ struct lkt_uri {
size_t id;
};
bool _allocated;
bool is_int;
};
/* Create and delete URIs */
......
......@@ -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:
......
......@@ -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;
......
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