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>
This commit is contained in:
Marc Mutz 2023-03-20 12:33:02 +01:00
parent fa5a8fa821
commit a845725d13

View File

@ -96,7 +96,6 @@ inline static QVarLengthArray<SQLTCHAR> toSQLTCHAR(const QString &input)
{ {
QVarLengthArray<SQLTCHAR> result; QVarLengthArray<SQLTCHAR> result;
toSQLTCHARImpl(result, input); 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; return result;
} }
@ -2129,7 +2128,10 @@ void QODBCDriverPrivate::checkUnicode()
hDbc, hDbc,
&hStmt); &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) { if (r == SQL_SUCCESS) {
r = SQLFetch(hStmt); r = SQLFetch(hStmt);
if (r == SQL_SUCCESS) { if (r == SQL_SUCCESS) {