From 9d045468305dfe21efd86d8e64aa11744a5b2895 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Sat, 23 Dec 2023 23:38:05 +0100 Subject: [PATCH] mx_mysql: Remove faulty errno range check The assertion mx_assert_return_minus_errno((unsigned int)(int)error == error, ERANGE); does not function as intended, as the conditional expression is optimized away to true by gcc with -O1 and up [1]. While there are alternatives to detect values outside of the range [0..-INT_MIN] that could not be negated into the range [INT_MIN..0], the check appears to be unnecessary. All callers use the MySQL error numbe for comparison with constants. This commit removes the helper functions `mx__mysql_errno()` and `mx__mysql_stmt_errno()` and replaces them with native MySQL calls. [1]: https://godbolt.org/z/1ajK384Ge --- mx_mysql.c | 48 ++++++++++-------------------------------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/mx_mysql.c b/mx_mysql.c index b29c7eda..3aa8daee 100644 --- a/mx_mysql.c +++ b/mx_mysql.c @@ -45,20 +45,6 @@ char *mx_mysql_error(void) { return mx_mysql_last_error == NULL ? "no error information" : mx_mysql_last_error; } -static int mx__mysql_errno(struct mx_mysql *mysql) -{ - unsigned int error; - - mx_assert_return_minus_errno(mysql, EINVAL); - mx_assert_return_minus_errno(mysql->mysql, EBADF); - - error = mysql_errno(mysql->mysql); - mx_assert_return_minus_errno((unsigned int)(int)error == error, ERANGE); - - /* no mysql errors possible */ - return (int)error; -} - static const char *mx__mysql_error(struct mx_mysql *mysql) { mx_assert_return_NULL(mysql, EINVAL); @@ -68,20 +54,6 @@ static const char *mx__mysql_error(struct mx_mysql *mysql) return mysql_error(mysql->mysql); } -static int mx__mysql_stmt_errno(struct mx_mysql_stmt *stmt) -{ - unsigned int error; - - mx_assert_return_minus_errno(stmt, EINVAL); - mx_assert_return_minus_errno(stmt->stmt, EBADF); - - error = mysql_stmt_errno(stmt->stmt); - mx_assert_return_minus_errno((unsigned int)(int)error == error, ERANGE); - - /* no mysql errors possible */ - return (int)error; -} - static int mx__mysql_init(struct mx_mysql *mysql) { mx_assert_return_minus_errno(mysql, EINVAL); @@ -121,7 +93,7 @@ static int mx__mysql_real_connect(struct mx_mysql *mysql, const char *host, cons mx_mysql_save_error(mysql_error(mysql->mysql)); - switch (mx__mysql_errno(mysql)) { + switch (mysql_errno(mysql->mysql)) { case CR_ALREADY_CONNECTED: return -EALREADY; @@ -154,7 +126,7 @@ static int mx__mysql_ping(struct mx_mysql *mysql) mx_mysql_save_error(mysql_error(mysql->mysql)); - switch (mx__mysql_errno(mysql)) { + switch (mysql_errno(mysql->mysql)) { case CR_COMMANDS_OUT_OF_SYNC: return -EPROTO; @@ -210,7 +182,7 @@ static int mx__mysql_stmt_prepare(struct mx_mysql_stmt *stmt, char *statement) } mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_OUT_OF_MEMORY: return -ENOMEM; @@ -244,7 +216,7 @@ static int mx__mysql_stmt_bind_param(struct mx_mysql_stmt *stmt) mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_OUT_OF_MEMORY: return -ENOMEM; @@ -270,7 +242,7 @@ static int mx__mysql_stmt_bind_result(struct mx_mysql_stmt *stmt) mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_OUT_OF_MEMORY: return -ENOMEM; @@ -296,7 +268,7 @@ static int mx__mysql_stmt_execute(struct mx_mysql_stmt *stmt) mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_COMMANDS_OUT_OF_SYNC: return -EPROTO; @@ -326,7 +298,7 @@ static int mx__mysql_stmt_store_result(struct mx_mysql_stmt *stmt) mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_COMMANDS_OUT_OF_SYNC: return -EPROTO; @@ -372,7 +344,7 @@ static int mx__mysql_stmt_fetch(struct mx_mysql_stmt *stmt) if (res == 1) { mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_OUT_OF_MEMORY: return -ENOMEM; @@ -412,7 +384,7 @@ static int mx__mysql_stmt_fetch_column(struct mx_mysql_stmt *stmt, unsigned int return 0; mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_INVALID_PARAMETER_NO: return -EPROTO; @@ -493,7 +465,7 @@ static int mx__mysql_stmt_close(struct mx_mysql_stmt *stmt) } mx_mysql_save_error(mysql_stmt_error(stmt->stmt)); - switch (mx__mysql_stmt_errno(stmt)) { + switch (mysql_stmt_errno(stmt->stmt)) { case CR_SERVER_GONE_ERROR: return -ECONNABORTED;