Skip to content

Commit ce81c9f

Browse files
committed
ODBC-380 Memory leak during connect if multistatement option selected
The leak occurred once per connection due to missing MADB_DynstrFree call(the other small change in commit is not related). Some cleaning in the testcases, so that their own leaks do not create any noise.
1 parent 8fc8d33 commit ce81c9f

File tree

4 files changed

+18
-19
lines changed

4 files changed

+18
-19
lines changed

libmariadb

ma_connection.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,7 @@ SQLRETURN MADB_DbcConnectDB(MADB_Dbc *Connection,
805805
if (DSN_OPTION(Connection, MADB_OPT_FLAG_MULTI_STATEMENTS))
806806
{
807807
mysql_optionsv(Connection->mariadb, MYSQL_INIT_COMMAND, InitCmd.str);
808+
MADB_DynstrFree(&InitCmd);
808809
}
809810

810811
if (Dsn->ConnectionTimeout)

ma_statement.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ SQLRETURN MADB_StmtBindCol(MADB_Stmt *Stmt, SQLUSMALLINT ColumnNumber, SQLSMALLI
15311531

15321532
if ((ColumnNumber < 1 && Stmt->Options.UseBookmarks == SQL_UB_OFF) ||
15331533
(mysql_stmt_field_count(Stmt->stmt) &&
1534-
Stmt->stmt->state > MYSQL_STMT_PREPARED &&
1534+
STMT_WAS_PREPARED(Stmt) &&
15351535
ColumnNumber > mysql_stmt_field_count(Stmt->stmt)))
15361536
{
15371537
MADB_SetError(&Stmt->Error, MADB_ERR_07009, NULL, 0);

test/types.c

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ int sqlnum_test_from_str(SQLHANDLE Stmt,
803803
SQLCHAR sign, SQLCHAR *expdata, int expnum,
804804
SQLRETURN overflow)
805805
{
806-
SQL_NUMERIC_STRUCT *sqlnum= malloc(sizeof(SQL_NUMERIC_STRUCT));
806+
SQL_NUMERIC_STRUCT sqlnum;/*= malloc(sizeof(SQL_NUMERIC_STRUCT));*/
807807
SQLCHAR buf[512];
808808
SQLHANDLE ard;
809809
unsigned long long numval;
@@ -821,7 +821,7 @@ int sqlnum_test_from_str(SQLHANDLE Stmt,
821821
CHECK_HANDLE_RC(SQL_HANDLE_DESC, ard, SQLSetDescField(ard, 1, SQL_DESC_SCALE,
822822
(SQLPOINTER)(SQLLEN) scale, SQL_IS_INTEGER));
823823
CHECK_HANDLE_RC(SQL_HANDLE_DESC, ard, SQLSetDescField(ard, 1, SQL_DESC_DATA_PTR,
824-
sqlnum, SQL_IS_POINTER));
824+
&sqlnum, SQL_IS_POINTER));
825825
if (overflow != SQL_SUCCESS)
826826
{
827827
EXPECT_STMT(Stmt, SQLFetch(Stmt), overflow);
@@ -838,12 +838,12 @@ int sqlnum_test_from_str(SQLHANDLE Stmt,
838838
else
839839
CHECK_HANDLE_RC(SQL_HANDLE_STMT, Stmt, SQLFetch(Stmt));
840840

841-
is_num(sqlnum->precision, prec);
842-
is_num(sqlnum->scale, scale);
843-
is_num(sqlnum->sign, sign);
841+
is_num(sqlnum.precision, prec);
842+
is_num(sqlnum.scale, scale);
843+
is_num(sqlnum.sign, sign);
844844
if (expdata)
845845
{
846-
IS(!memcmp(sqlnum->val, expdata, SQL_MAX_NUMERIC_LEN));
846+
IS(!memcmp(sqlnum.val, expdata, SQL_MAX_NUMERIC_LEN));
847847
}
848848
else
849849
{
@@ -853,7 +853,7 @@ int sqlnum_test_from_str(SQLHANDLE Stmt,
853853
numval= 0;
854854
for (i= 0; i < 8; ++i)
855855
{
856-
singleByte= sqlnum->val[7 - i];
856+
singleByte= sqlnum.val[7 - i];
857857
numval+= singleByte << (8 * (7 - i));
858858
}
859859
if (numval != expnum)
@@ -863,7 +863,6 @@ int sqlnum_test_from_str(SQLHANDLE Stmt,
863863

864864
CHECK_HANDLE_RC(SQL_HANDLE_STMT, Stmt, SQLFreeStmt(Stmt, SQL_CLOSE));
865865

866-
free(sqlnum);
867866
return OK;
868867
}
869868

@@ -1037,7 +1036,7 @@ int sqlnum_test_to_str(SQLHANDLE Stmt, SQLCHAR* numdata, SQLCHAR prec,
10371036
SQLSCHAR scale, SQLCHAR sign, char* outstr,
10381037
char* exptrunc)
10391038
{
1040-
SQL_NUMERIC_STRUCT* sqlnum = malloc(sizeof(SQL_NUMERIC_STRUCT));
1039+
SQL_NUMERIC_STRUCT sqlnum;
10411040
SQLCHAR obuf[80]; /*1 sign + 39 + 1 dot + 38 + \0 */
10421041
SQLRETURN exprc = SQL_SUCCESS;
10431042
SQLLEN len;
@@ -1056,11 +1055,11 @@ int sqlnum_test_to_str(SQLHANDLE Stmt, SQLCHAR* numdata, SQLCHAR prec,
10561055
else if (!strcmp("22003", exptrunc))
10571056
exprc= SQL_ERROR;
10581057

1059-
sqlnum->sign = sign;
1060-
memcpy(sqlnum->val, numdata, SQL_MAX_NUMERIC_LEN);
1058+
sqlnum.sign = sign;
1059+
memcpy(sqlnum.val, numdata, SQL_MAX_NUMERIC_LEN);
10611060

10621061
EXPECT_STMT(Stmt, SQLBindParameter(Stmt, 1, SQL_PARAM_INPUT, SQL_C_NUMERIC,
1063-
SQL_DECIMAL, prec, scale, sqlnum, 0, NULL), scale > 38 ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS);
1062+
SQL_DECIMAL, prec, scale, &sqlnum, 0, NULL), scale > 38 ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS);
10641063

10651064
EXPECT_STMT(Stmt, SQLExecDirect(Stmt, "SELECT ?", SQL_NTS), exprc);
10661065

@@ -1076,17 +1075,16 @@ int sqlnum_test_to_str(SQLHANDLE Stmt, SQLCHAR* numdata, SQLCHAR prec,
10761075
/* Error heere may occur on execution. Checking SQLFetch result is pretty useless */
10771076
CHECK_STMT_RC(Stmt, SQLFetch(Stmt));
10781077

1079-
is_num(sqlnum->precision, prec);
1080-
is_num(sqlnum->scale, (scale > 38 ? 38 : scale));
1081-
is_num(sqlnum->sign, sign);
1078+
is_num(sqlnum.precision, prec);
1079+
is_num(sqlnum.scale, (scale > 38 ? 38 : scale));
1080+
is_num(sqlnum.sign, sign);
10821081
CHECK_HANDLE_RC(SQL_HANDLE_STMT, Stmt, SQLGetData(Stmt, 1, SQL_C_CHAR, obuf, sizeof(obuf), &len));
10831082
IS_STR(obuf, outstr, len + 1);
10841083
/* This is seemingly useless check */
1085-
FAIL_IF(memcmp(sqlnum->val, numdata, SQL_MAX_NUMERIC_LEN), "memcmp failed");
1084+
FAIL_IF(memcmp(sqlnum.val, numdata, SQL_MAX_NUMERIC_LEN), "memcmp failed");
10861085

10871086
CHECK_HANDLE_RC(SQL_HANDLE_STMT, Stmt, SQLFreeStmt(Stmt, SQL_CLOSE));
10881087

1089-
free(sqlnum);
10901088
return OK;
10911089
}
10921090

0 commit comments

Comments
 (0)