summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-03-20 12:33:02 +0100
committerMarc Mutz <marc.mutz@qt.io>2023-03-23 06:22:13 +0000
commita845725d13e73b7be3cd9e05e726bf5b6234b26c (patch)
tree39cd8befd2cce3f1bd55f11c80d9a1e577eddcb3
parentfa5a8fa82193f82ca9fd3f6c20497ed634674c1f (diff)
downloadqtbase-a845725d13e73b7be3cd9e05e726bf5b6234b26c.tar.gz
QSQL/ODBC: fix regression (trailing NUL)
When we fixed the callers of toSQLTCHAR() to use the result's size() instead of the input's (which differ, if sizeof(SQLTCHAR) != 2), we exposed callers to the append(0), which changes the size() of the result QVLA. Callers that don't rely on NUL-termination (all?) now saw an additional training NUL. Fix by not NUL-terminating, and changing the only user of SQL_NTS to use an explicit length. Amends 4c445ef0bae8b36ec4a742552f0ebd81a1a90723 and 46af1fe49f7f419dc1b3231de9860e2da0ea48f8. Done-with: Christian Ehrlicher <ch.ehrlicher@gmx.de> Change-Id: I6210b77e9417f46294df94cb32ab4134af8dc4c2 Reviewed-by: Andy Shaw <andy.shaw@qt.io> (cherry picked from commit 9020034b3b6a3a8118e5959beed699bb8aaa3f95) Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--src/plugins/sqldrivers/odbc/qsql_odbc.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
index 9c4d61eb4b..b7415123a9 100644
--- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
@@ -96,7 +96,6 @@ inline static QVarLengthArray<SQLTCHAR> toSQLTCHAR(const QString &input)
{
QVarLengthArray<SQLTCHAR> result;
toSQLTCHARImpl(result, input);
- result.append(0); // make sure it's null terminated, doesn't matter if it already is, it does if it isn't.
return result;
}
@@ -2129,7 +2128,10 @@ void QODBCDriverPrivate::checkUnicode()
hDbc,
&hStmt);
- r = SQLExecDirect(hStmt, toSQLTCHAR("select 'test'"_L1).data(), SQL_NTS);
+ {
+ auto encoded = toSQLTCHAR("select 'test'"_L1);
+ r = SQLExecDirect(hStmt, encoded.data(), SQLINTEGER(encoded.size()));
+ }
if (r == SQL_SUCCESS) {
r = SQLFetch(hStmt);
if (r == SQL_SUCCESS) {