fix(ODBC): Unicode wrappers do not check for null length pointers #4505

This commit is contained in:
Aleksandar Fabijanic
2024-03-21 14:03:23 -05:00
parent 03c2fa3eea
commit 480f992aa4
4 changed files with 151 additions and 32 deletions

View File

@@ -97,7 +97,7 @@ void ConnectionHandle::setTimeouts(SQLULEN loginTimeout, SQLULEN timeout)
{ {
try try
{ {
setTimeout(timeout); setTimeout(static_cast<int>(timeout));
} }
catch(const NotSupportedException&) {} catch(const NotSupportedException&) {}
} }
@@ -145,7 +145,7 @@ bool ConnectionHandle::connect(const std::string& connectString, SQLULEN loginTi
// for Oracle) flat out refuse to set login timeout and return error - that's why these calls // for Oracle) flat out refuse to set login timeout and return error - that's why these calls
// are wrapped in try/catch and silently ignore errors. // are wrapped in try/catch and silently ignore errors.
if (getTimeout() != timeout) if (getTimeout() != timeout)
setTimeout(timeout); setTimeout(static_cast<int>(timeout));
if (getLoginTimeout() != loginTimeout) if (getLoginTimeout() != loginTimeout)
setLoginTimeout(loginTimeout); setLoginTimeout(loginTimeout);
} }

View File

@@ -248,7 +248,7 @@ inline Poco::Any SessionImpl::getCursorUse(const std::string&) const
void SessionImpl::setConnectionTimeout(std::size_t timeout) void SessionImpl::setConnectionTimeout(std::size_t timeout)
{ {
SQLULEN value = static_cast<SQLUINTEGER>(timeout); SQLULEN value = static_cast<SQLUINTEGER>(timeout);
_db.setTimeout(value); _db.setTimeout(static_cast<int>(value));
} }

View File

@@ -14,6 +14,7 @@
#include "Poco/Data/ODBC/ODBC.h" #include "Poco/Data/ODBC/ODBC.h"
#include "Poco/Data/ODBC/Unicode_UNIXODBC.h" #include "Poco/Data/ODBC/Unicode_UNIXODBC.h"
#include "Poco/Data/ODBC/Utility.h"
#include "Poco/TextConverter.h" #include "Poco/TextConverter.h"
#include "Poco/UTF8Encoding.h" #include "Poco/UTF8Encoding.h"
#include "Poco/UTF16Encoding.h" #include "Poco/UTF16Encoding.h"
@@ -73,6 +74,12 @@ SQLRETURN SQLColAttribute(SQLHSTMT hstmt,
SQLSMALLINT* pcbCharAttr, SQLSMALLINT* pcbCharAttr,
NumAttrPtrType pNumAttr) NumAttrPtrType pNumAttr)
{ {
SQLSMALLINT cbCharAttr = 0;
if (!pcbCharAttr) pcbCharAttr = &cbCharAttr;
SQLSMALLINT cbCharAttr;
if (!pcbCharAttr) pcbCharAttr = &cbCharAttr;
if (isString(pCharAttr, cbCharAttrMax)) if (isString(pCharAttr, cbCharAttrMax))
{ {
Buffer<SQLWCHAR> buffer(stringLength(pCharAttr, cbCharAttrMax)); Buffer<SQLWCHAR> buffer(stringLength(pCharAttr, cbCharAttrMax));
@@ -85,7 +92,9 @@ SQLRETURN SQLColAttribute(SQLHSTMT hstmt,
pcbCharAttr, pcbCharAttr,
pNumAttr); pNumAttr);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbCharAttr, pCharAttr, cbCharAttrMax); makeUTF8(buffer, *pcbCharAttr, pCharAttr, cbCharAttrMax);
return rc; return rc;
} }
@@ -107,6 +116,11 @@ SQLRETURN SQLColAttributes(SQLHSTMT hstmt,
SQLSMALLINT* pcbDesc, SQLSMALLINT* pcbDesc,
SQLLEN* pfDesc) SQLLEN* pfDesc)
{ {
SQLSMALLINT cbDesc = 0;
if (!pcbDesc) pcbDesc = &cbDesc;
SQLLEN fDesc = 0;
if (!pfDesc) pfDesc = &fDesc;
return SQLColAttribute(hstmt, return SQLColAttribute(hstmt,
icol, icol,
fDescType, fDescType,
@@ -151,6 +165,17 @@ SQLRETURN SQLDescribeCol(SQLHSTMT hstmt,
SQLSMALLINT* pibScale, SQLSMALLINT* pibScale,
SQLSMALLINT* pfNullable) SQLSMALLINT* pfNullable)
{ {
SQLSMALLINT cbColName = 0;
if (!pcbColName) pcbColName = &cbColName;
SQLSMALLINT fSqlType = 0;
if (!pfSqlType) pfSqlType = &fSqlType;
SQLULEN cbColDef = 0;
if (!pcbColDef) pcbColDef = &cbColDef;
SQLSMALLINT ibScale = 0;
if (!pibScale) pibScale = &ibScale;
SQLSMALLINT fNullable = 0;
if (!pfNullable) pfNullable = &fNullable;
Buffer<SQLWCHAR> buffer(cbColNameMax); Buffer<SQLWCHAR> buffer(cbColNameMax);
SQLRETURN rc = SQLDescribeColW(hstmt, SQLRETURN rc = SQLDescribeColW(hstmt,
icol, icol,
@@ -162,7 +187,9 @@ SQLRETURN SQLDescribeCol(SQLHSTMT hstmt,
pibScale, pibScale,
pfNullable); pfNullable);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbColName * sizeof(SQLWCHAR), szColName, cbColNameMax); makeUTF8(buffer, *pcbColName * sizeof(SQLWCHAR), szColName, cbColNameMax);
return rc; return rc;
} }
@@ -198,6 +225,9 @@ SQLRETURN SQLGetConnectAttr(SQLHDBC hdbc,
SQLINTEGER cbValueMax, SQLINTEGER cbValueMax,
SQLINTEGER* pcbValue) SQLINTEGER* pcbValue)
{ {
SQLINTEGER cbValue = 0;
if (!pcbValue) pcbValue = &cbValue;
if (isString(rgbValue, cbValueMax)) if (isString(rgbValue, cbValueMax))
{ {
Buffer<SQLWCHAR> buffer(stringLength(rgbValue, cbValueMax)); Buffer<SQLWCHAR> buffer(stringLength(rgbValue, cbValueMax));
@@ -208,6 +238,7 @@ SQLRETURN SQLGetConnectAttr(SQLHDBC hdbc,
(SQLINTEGER) buffer.sizeBytes(), (SQLINTEGER) buffer.sizeBytes(),
pcbValue); pcbValue);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax); makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax);
return rc; return rc;
} }
@@ -263,6 +294,9 @@ SQLRETURN SQLGetDescField(SQLHDESC hdesc,
SQLINTEGER cbValueMax, SQLINTEGER cbValueMax,
SQLINTEGER* pcbValue) SQLINTEGER* pcbValue)
{ {
SQLINTEGER cbValue = 0;
if (!pcbValue) pcbValue = &cbValue;
if (isString(rgbValue, cbValueMax)) if (isString(rgbValue, cbValueMax))
{ {
Buffer<SQLWCHAR> buffer(stringLength(rgbValue, cbValueMax)); Buffer<SQLWCHAR> buffer(stringLength(rgbValue, cbValueMax));
@@ -274,6 +308,7 @@ SQLRETURN SQLGetDescField(SQLHDESC hdesc,
(SQLINTEGER) buffer.sizeBytes(), (SQLINTEGER) buffer.sizeBytes(),
pcbValue); pcbValue);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax); makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax);
return rc; return rc;
@@ -312,6 +347,9 @@ SQLRETURN SQLGetDiagField(SQLSMALLINT fHandleType,
SQLSMALLINT cbDiagInfoMax, SQLSMALLINT cbDiagInfoMax,
SQLSMALLINT* pcbDiagInfo) SQLSMALLINT* pcbDiagInfo)
{ {
SQLSMALLINT cbDiagInfo = 0;
if (!pcbDiagInfo) pcbDiagInfo = &cbDiagInfo;
if (isString(rgbDiagInfo, cbDiagInfoMax)) if (isString(rgbDiagInfo, cbDiagInfoMax))
{ {
Buffer<SQLWCHAR> buffer(stringLength(rgbDiagInfo, cbDiagInfoMax)); Buffer<SQLWCHAR> buffer(stringLength(rgbDiagInfo, cbDiagInfoMax));
@@ -324,6 +362,7 @@ SQLRETURN SQLGetDiagField(SQLSMALLINT fHandleType,
(SQLSMALLINT) buffer.sizeBytes(), (SQLSMALLINT) buffer.sizeBytes(),
pcbDiagInfo); pcbDiagInfo);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbDiagInfo, rgbDiagInfo, cbDiagInfoMax); makeUTF8(buffer, *pcbDiagInfo, rgbDiagInfo, cbDiagInfoMax);
return rc; return rc;
@@ -348,6 +387,11 @@ SQLRETURN SQLGetDiagRec(SQLSMALLINT fHandleType,
SQLSMALLINT cbErrorMsgMax, SQLSMALLINT cbErrorMsgMax,
SQLSMALLINT* pcbErrorMsg) SQLSMALLINT* pcbErrorMsg)
{ {
SQLINTEGER fNativeError = 0;
if (!pfNativeError) pfNativeError = &fNativeError;
SQLSMALLINT cbErrorMsg = 0;
if (!pcbErrorMsg) pcbErrorMsg = &cbErrorMsg;
const SQLINTEGER stateLen = SQL_SQLSTATE_SIZE + 1; const SQLINTEGER stateLen = SQL_SQLSTATE_SIZE + 1;
Buffer<SQLWCHAR> bufState(stateLen); Buffer<SQLWCHAR> bufState(stateLen);
Buffer<SQLWCHAR> bufErr(cbErrorMsgMax); Buffer<SQLWCHAR> bufErr(cbErrorMsgMax);
@@ -361,8 +405,11 @@ SQLRETURN SQLGetDiagRec(SQLSMALLINT fHandleType,
(SQLSMALLINT) bufErr.size(), (SQLSMALLINT) bufErr.size(),
pcbErrorMsg); pcbErrorMsg);
if (!Utility::isError(rc))
{
makeUTF8(bufState, stateLen * sizeof(SQLWCHAR), szSqlState, stateLen); makeUTF8(bufState, stateLen * sizeof(SQLWCHAR), szSqlState, stateLen);
makeUTF8(bufErr, *pcbErrorMsg * sizeof(SQLWCHAR), szErrorMsg, cbErrorMsgMax); makeUTF8(bufErr, *pcbErrorMsg * sizeof(SQLWCHAR), szErrorMsg, cbErrorMsgMax);
}
return rc; return rc;
} }
@@ -433,6 +480,9 @@ SQLRETURN SQLGetStmtAttr(SQLHSTMT hstmt,
SQLINTEGER cbValueMax, SQLINTEGER cbValueMax,
SQLINTEGER* pcbValue) SQLINTEGER* pcbValue)
{ {
SQLINTEGER cbValue = 0;
if (!pcbValue) pcbValue = &cbValue;
if (isString(rgbValue, cbValueMax)) if (isString(rgbValue, cbValueMax))
{ {
Buffer<SQLWCHAR> buffer(stringLength(rgbValue, cbValueMax)); Buffer<SQLWCHAR> buffer(stringLength(rgbValue, cbValueMax));
@@ -476,6 +526,9 @@ SQLRETURN SQLGetInfo(SQLHDBC hdbc,
SQLSMALLINT cbInfoValueMax, SQLSMALLINT cbInfoValueMax,
SQLSMALLINT* pcbInfoValue) SQLSMALLINT* pcbInfoValue)
{ {
SQLSMALLINT cbInfoValue = 0;
if (!pcbInfoValue) pcbInfoValue = &cbInfoValue;
if (cbInfoValueMax) if (cbInfoValueMax)
{ {
Buffer<SQLWCHAR> buffer(cbInfoValueMax); Buffer<SQLWCHAR> buffer(cbInfoValueMax);
@@ -486,6 +539,7 @@ SQLRETURN SQLGetInfo(SQLHDBC hdbc,
(SQLSMALLINT) buffer.sizeBytes(), (SQLSMALLINT) buffer.sizeBytes(),
pcbInfoValue); pcbInfoValue);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbInfoValue, rgbInfoValue, cbInfoValueMax); makeUTF8(buffer, *pcbInfoValue, rgbInfoValue, cbInfoValueMax);
return rc; return rc;
@@ -561,6 +615,10 @@ SQLRETURN SQLDataSources(SQLHENV henv,
SQLSMALLINT cbDescMax, SQLSMALLINT cbDescMax,
SQLSMALLINT* pcbDesc) SQLSMALLINT* pcbDesc)
{ {
SQLSMALLINT cbDSN = 0, cbDesc = 0;
if (!pcbDSN) pcbDSN = &cbDSN;
if (!pcbDesc) pcbDesc = &cbDesc;
Buffer<SQLWCHAR> bufDSN(cbDSNMax); Buffer<SQLWCHAR> bufDSN(cbDSNMax);
Buffer<SQLWCHAR> bufDesc(cbDescMax); Buffer<SQLWCHAR> bufDesc(cbDescMax);
@@ -573,8 +631,11 @@ SQLRETURN SQLDataSources(SQLHENV henv,
(SQLSMALLINT) bufDesc.size(), (SQLSMALLINT) bufDesc.size(),
pcbDesc); pcbDesc);
if (!Utility::isError(rc))
{
makeUTF8(bufDSN, *pcbDSN * sizeof(SQLWCHAR), szDSN, cbDSNMax); makeUTF8(bufDSN, *pcbDSN * sizeof(SQLWCHAR), szDSN, cbDSNMax);
makeUTF8(bufDesc, *pcbDesc * sizeof(SQLWCHAR), szDesc, cbDescMax); makeUTF8(bufDesc, *pcbDesc * sizeof(SQLWCHAR), szDesc, cbDescMax);
}
return rc; return rc;
} }
@@ -589,6 +650,9 @@ SQLRETURN SQLDriverConnect(SQLHDBC hdbc,
SQLSMALLINT* pcbConnStrOut, SQLSMALLINT* pcbConnStrOut,
SQLUSMALLINT fDriverCompletion) SQLUSMALLINT fDriverCompletion)
{ {
SQLSMALLINT cbConnStrOut = 0;
if (!pcbConnStrOut) pcbConnStrOut = &cbConnStrOut;
SQLSMALLINT len = cbConnStrIn; SQLSMALLINT len = cbConnStrIn;
if (SQL_NTS == len) if (SQL_NTS == len)
len = (SQLSMALLINT) std::strlen((const char*) szConnStrIn) + 1; len = (SQLSMALLINT) std::strlen((const char*) szConnStrIn) + 1;
@@ -606,6 +670,7 @@ SQLRETURN SQLDriverConnect(SQLHDBC hdbc,
pcbConnStrOut, pcbConnStrOut,
fDriverCompletion); fDriverCompletion);
if (!Utility::isError(rc))
makeUTF8(out, *pcbConnStrOut * sizeof(SQLWCHAR), pcbConnStrOut, cbConnStrOutMax); makeUTF8(out, *pcbConnStrOut * sizeof(SQLWCHAR), pcbConnStrOut, cbConnStrOutMax);
return rc; return rc;
@@ -619,6 +684,9 @@ SQLRETURN SQLBrowseConnect(SQLHDBC hdbc,
SQLSMALLINT cbConnStrOutMax, SQLSMALLINT cbConnStrOutMax,
SQLSMALLINT* pcbConnStrOut) SQLSMALLINT* pcbConnStrOut)
{ {
SQLSMALLINT cbConnStrOut = 0;
if (!pcbConnStrOut) pcbConnStrOut = &cbConnStrOut;
std::string str; std::string str;
makeUTF16(szConnStrIn, cbConnStrIn, str); makeUTF16(szConnStrIn, cbConnStrIn, str);
@@ -631,6 +699,7 @@ SQLRETURN SQLBrowseConnect(SQLHDBC hdbc,
(SQLSMALLINT) bufConnStrOut.size(), (SQLSMALLINT) bufConnStrOut.size(),
pcbConnStrOut); pcbConnStrOut);
if (!Utility::isError(rc))
makeUTF8(bufConnStrOut, *pcbConnStrOut * sizeof(SQLWCHAR), szConnStrOut, cbConnStrOutMax); makeUTF8(bufConnStrOut, *pcbConnStrOut * sizeof(SQLWCHAR), szConnStrOut, cbConnStrOutMax);
return rc; return rc;
@@ -676,6 +745,9 @@ SQLRETURN SQLNativeSql(SQLHDBC hdbc,
SQLINTEGER cbSqlStrMax, SQLINTEGER cbSqlStrMax,
SQLINTEGER* pcbSqlStr) SQLINTEGER* pcbSqlStr)
{ {
SQLINTEGER cbSqlStr = 0;
if (!pcbSqlStr) pcbSqlStr = &cbSqlStr;
std::string str; std::string str;
makeUTF16(szSqlStrIn, cbSqlStrIn, str); makeUTF16(szSqlStrIn, cbSqlStrIn, str);
@@ -688,6 +760,7 @@ SQLRETURN SQLNativeSql(SQLHDBC hdbc,
(SQLINTEGER) bufSQLOut.size(), (SQLINTEGER) bufSQLOut.size(),
pcbSqlStr); pcbSqlStr);
if (!Utility::isError(rc))
makeUTF8(bufSQLOut, *pcbSqlStr * sizeof(SQLWCHAR), szSqlStr, cbSqlStrMax); makeUTF8(bufSQLOut, *pcbSqlStr * sizeof(SQLWCHAR), szSqlStr, cbSqlStrMax);
return rc; return rc;
@@ -753,6 +826,10 @@ SQLRETURN SQLDrivers(SQLHENV henv,
SQLSMALLINT cbDrvrAttrMax, SQLSMALLINT cbDrvrAttrMax,
SQLSMALLINT* pcbDrvrAttr) SQLSMALLINT* pcbDrvrAttr)
{ {
SQLSMALLINT cbDriverDesc = 0, cbDrvrAttr = 0;
if (!pcbDriverDesc) pcbDriverDesc = &cbDriverDesc;
if (!pcbDrvrAttr) pcbDrvrAttr = &cbDrvrAttr;
Buffer<SQLWCHAR> bufDriverDesc(cbDriverDescMax); Buffer<SQLWCHAR> bufDriverDesc(cbDriverDescMax);
Buffer<SQLWCHAR> bufDriverAttr(cbDrvrAttrMax); Buffer<SQLWCHAR> bufDriverAttr(cbDrvrAttrMax);
@@ -765,8 +842,11 @@ SQLRETURN SQLDrivers(SQLHENV henv,
(SQLSMALLINT) bufDriverAttr.size(), (SQLSMALLINT) bufDriverAttr.size(),
pcbDrvrAttr); pcbDrvrAttr);
if (!Utility::isError(rc))
{
makeUTF8(bufDriverDesc, *pcbDriverDesc * sizeof(SQLWCHAR), szDriverDesc, cbDriverDescMax); makeUTF8(bufDriverDesc, *pcbDriverDesc * sizeof(SQLWCHAR), szDriverDesc, cbDriverDescMax);
makeUTF8(bufDriverAttr, *pcbDrvrAttr * sizeof(SQLWCHAR), szDriverAttributes, cbDrvrAttrMax); makeUTF8(bufDriverAttr, *pcbDrvrAttr * sizeof(SQLWCHAR), szDriverAttributes, cbDrvrAttrMax);
}
return rc; return rc;
} }

View File

@@ -49,7 +49,9 @@ SQLRETURN SQLColAttribute(SQLHSTMT hstmt,
pcbCharAttr, pcbCharAttr,
pNumAttr); pNumAttr);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbCharAttr, pCharAttr, cbCharAttrMax); makeUTF8(buffer, *pcbCharAttr, pCharAttr, cbCharAttrMax);
return rc; return rc;
} }
@@ -129,7 +131,9 @@ SQLRETURN SQLDescribeCol(SQLHSTMT hstmt,
pibScale, pibScale,
pfNullable); pfNullable);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbColName * sizeof(wchar_t), szColName, cbColNameMax); makeUTF8(buffer, *pcbColName * sizeof(wchar_t), szColName, cbColNameMax);
return rc; return rc;
} }
@@ -167,6 +171,9 @@ SQLRETURN SQLGetConnectAttr(SQLHDBC hdbc,
SQLINTEGER cbValueMax, SQLINTEGER cbValueMax,
SQLINTEGER* pcbValue) SQLINTEGER* pcbValue)
{ {
SQLINTEGER cbValue = 0;
if (!pcbValue) pcbValue = &cbValue;
if (isString(rgbValue, cbValueMax)) if (isString(rgbValue, cbValueMax))
{ {
Buffer<wchar_t> buffer(stringLength(rgbValue, cbValueMax)); Buffer<wchar_t> buffer(stringLength(rgbValue, cbValueMax));
@@ -177,7 +184,9 @@ SQLRETURN SQLGetConnectAttr(SQLHDBC hdbc,
(SQLINTEGER) buffer.sizeBytes(), (SQLINTEGER) buffer.sizeBytes(),
pcbValue); pcbValue);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax); makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax);
return rc; return rc;
} }
@@ -234,6 +243,9 @@ SQLRETURN SQLGetDescField(SQLHDESC hdesc,
SQLINTEGER cbValueMax, SQLINTEGER cbValueMax,
SQLINTEGER* pcbValue) SQLINTEGER* pcbValue)
{ {
SQLINTEGER cbValue = 0;
if (!pcbValue) pcbValue = &cbValue;
if (isString(rgbValue, cbValueMax)) if (isString(rgbValue, cbValueMax))
{ {
Buffer<wchar_t> buffer(stringLength(rgbValue, cbValueMax)); Buffer<wchar_t> buffer(stringLength(rgbValue, cbValueMax));
@@ -245,7 +257,9 @@ SQLRETURN SQLGetDescField(SQLHDESC hdesc,
(SQLINTEGER) buffer.sizeBytes(), (SQLINTEGER) buffer.sizeBytes(),
pcbValue); pcbValue);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax); makeUTF8(buffer, *pcbValue, rgbValue, cbValueMax);
return rc; return rc;
} }
@@ -294,6 +308,7 @@ SQLRETURN SQLGetDiagField(SQLSMALLINT fHandleType,
(SQLSMALLINT) buffer.sizeBytes(), (SQLSMALLINT) buffer.sizeBytes(),
pcbDiagInfo); pcbDiagInfo);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbDiagInfo, rgbDiagInfo, cbDiagInfoMax); makeUTF8(buffer, *pcbDiagInfo, rgbDiagInfo, cbDiagInfoMax);
return rc; return rc;
} }
@@ -317,6 +332,12 @@ SQLRETURN SQLGetDiagRec(SQLSMALLINT fHandleType,
SQLSMALLINT cbErrorMsgMax, SQLSMALLINT cbErrorMsgMax,
SQLSMALLINT* pcbErrorMsg) SQLSMALLINT* pcbErrorMsg)
{ {
SQLINTEGER nativeError = 0;
SQLSMALLINT cbErrorMsg = 0;
if (!pfNativeError) pfNativeError = &nativeError;
if (!pcbErrorMsg) pcbErrorMsg = &cbErrorMsg;
const SQLINTEGER stateLen = SQL_SQLSTATE_SIZE + 1; const SQLINTEGER stateLen = SQL_SQLSTATE_SIZE + 1;
Buffer<wchar_t> bufState(stateLen); Buffer<wchar_t> bufState(stateLen);
Buffer<wchar_t> bufErr(cbErrorMsgMax); Buffer<wchar_t> bufErr(cbErrorMsgMax);
@@ -330,8 +351,11 @@ SQLRETURN SQLGetDiagRec(SQLSMALLINT fHandleType,
(SQLSMALLINT) bufErr.size(), (SQLSMALLINT) bufErr.size(),
pcbErrorMsg); pcbErrorMsg);
if (!Utility::isError(rc))
{
makeUTF8(bufState, stateLen * sizeof(wchar_t), szSqlState, stateLen); makeUTF8(bufState, stateLen * sizeof(wchar_t), szSqlState, stateLen);
makeUTF8(bufErr, *pcbErrorMsg * sizeof(wchar_t), szErrorMsg, cbErrorMsgMax); makeUTF8(bufErr, *pcbErrorMsg * sizeof(wchar_t), szErrorMsg, cbErrorMsgMax);
}
return rc; return rc;
} }
@@ -410,6 +434,9 @@ SQLRETURN SQLGetStmtAttr(SQLHSTMT hstmt,
SQLINTEGER cbValueMax, SQLINTEGER cbValueMax,
SQLINTEGER* pcbValue) SQLINTEGER* pcbValue)
{ {
SQLINTEGER cbValue = 0;
if (!pcbValue) pcbValue = &cbValue;
if (isString(rgbValue, cbValueMax)) if (isString(rgbValue, cbValueMax))
{ {
Buffer<wchar_t> buffer(stringLength(rgbValue, cbValueMax)); Buffer<wchar_t> buffer(stringLength(rgbValue, cbValueMax));
@@ -457,6 +484,9 @@ SQLRETURN SQLGetInfo(SQLHDBC hdbc,
SQLSMALLINT cbInfoValueMax, SQLSMALLINT cbInfoValueMax,
SQLSMALLINT* pcbInfoValue) SQLSMALLINT* pcbInfoValue)
{ {
SQLSMALLINT cbValue = 0;
if (!pcbInfoValue) pcbInfoValue = &cbValue;
if (cbInfoValueMax) if (cbInfoValueMax)
{ {
Buffer<wchar_t> buffer(cbInfoValueMax); Buffer<wchar_t> buffer(cbInfoValueMax);
@@ -467,6 +497,7 @@ SQLRETURN SQLGetInfo(SQLHDBC hdbc,
(SQLSMALLINT) buffer.sizeBytes(), (SQLSMALLINT) buffer.sizeBytes(),
pcbInfoValue); pcbInfoValue);
if (!Utility::isError(rc))
makeUTF8(buffer, *pcbInfoValue, rgbInfoValue, cbInfoValueMax); makeUTF8(buffer, *pcbInfoValue, rgbInfoValue, cbInfoValueMax);
return rc; return rc;
@@ -558,8 +589,11 @@ SQLRETURN SQLDataSources(SQLHENV henv,
(SQLSMALLINT) bufDesc.size(), (SQLSMALLINT) bufDesc.size(),
pcbDesc); pcbDesc);
if (!Utility::isError(rc))
{
makeUTF8(bufDSN, *pcbDSN * sizeof(wchar_t), szDSN, cbDSNMax); makeUTF8(bufDSN, *pcbDSN * sizeof(wchar_t), szDSN, cbDSNMax);
makeUTF8(bufDesc, *pcbDesc * sizeof(wchar_t), szDesc, cbDescMax); makeUTF8(bufDesc, *pcbDesc * sizeof(wchar_t), szDesc, cbDescMax);
}
return rc; return rc;
} }
@@ -617,6 +651,7 @@ SQLRETURN SQLBrowseConnect(SQLHDBC hdbc,
(SQLSMALLINT) bufConnStrOut.size(), (SQLSMALLINT) bufConnStrOut.size(),
pcbConnStrOut); pcbConnStrOut);
if (!Utility::isError(rc))
makeUTF8(bufConnStrOut, *pcbConnStrOut * sizeof(wchar_t), szConnStrOut, cbConnStrOutMax); makeUTF8(bufConnStrOut, *pcbConnStrOut * sizeof(wchar_t), szConnStrOut, cbConnStrOutMax);
return rc; return rc;
@@ -674,6 +709,7 @@ SQLRETURN SQLNativeSql(SQLHDBC hdbc,
(SQLINTEGER) bufSQLOut.size(), (SQLINTEGER) bufSQLOut.size(),
pcbSqlStr); pcbSqlStr);
if (!Utility::isError(rc))
makeUTF8(bufSQLOut, *pcbSqlStr * sizeof(wchar_t), szSqlStr, cbSqlStrMax); makeUTF8(bufSQLOut, *pcbSqlStr * sizeof(wchar_t), szSqlStr, cbSqlStrMax);
return rc; return rc;
@@ -751,8 +787,11 @@ SQLRETURN SQLDrivers(SQLHENV henv,
(SQLSMALLINT) bufDriverAttr.size(), (SQLSMALLINT) bufDriverAttr.size(),
pcbDrvrAttr); pcbDrvrAttr);
if (!Utility::isError(rc))
{
makeUTF8(bufDriverDesc, *pcbDriverDesc * sizeof(wchar_t), szDriverDesc, cbDriverDescMax); makeUTF8(bufDriverDesc, *pcbDriverDesc * sizeof(wchar_t), szDriverDesc, cbDriverDescMax);
makeUTF8(bufDriverAttr, *pcbDrvrAttr * sizeof(wchar_t), szDriverAttributes, cbDrvrAttrMax); makeUTF8(bufDriverAttr, *pcbDrvrAttr * sizeof(wchar_t), szDriverAttributes, cbDrvrAttrMax);
}
return rc; return rc;
} }