From 58f20684798bbf4f4b8f2b4b41d107785d1352de Mon Sep 17 00:00:00 2001 From: Jenny Tam Date: Tue, 29 Aug 2017 13:42:15 -0700 Subject: [PATCH] conflicts in msodbcsql --- source/pdo_sqlsrv/pdo_dbh.cpp | 72 ++++++++++++------------ source/shared/core_conn.cpp | 6 +- source/sqlsrv/conn.cpp | 90 +++++++++++++++--------------- test/functional/setup/build_ksp.py | 44 +++++++-------- test/functional/setup/ksp_app.c | 15 +++-- 5 files changed, 116 insertions(+), 111 deletions(-) diff --git a/source/pdo_sqlsrv/pdo_dbh.cpp b/source/pdo_sqlsrv/pdo_dbh.cpp index 94c9b074..b86bec0e 100644 --- a/source/pdo_sqlsrv/pdo_dbh.cpp +++ b/source/pdo_sqlsrv/pdo_dbh.cpp @@ -225,42 +225,42 @@ const connection_option PDO_CONN_OPTS[] = { CONN_ATTR_BOOL, conn_null_func::func }, - { - PDOConnOptionNames::ColumnEncryption, - sizeof(PDOConnOptionNames::ColumnEncryption), - SQLSRV_CONN_OPTION_COLUMNENCRYPTION, - ODBCConnOptions::ColumnEncryption, - sizeof(ODBCConnOptions::ColumnEncryption), - CONN_ATTR_STRING, - column_encryption_set_func::func - }, - { - PDOConnOptionNames::CEKeystoreProvider, - sizeof(PDOConnOptionNames::CEKeystoreProvider), - SQLSRV_CONN_OPTION_CEKEYSTORE_PROVIDER, - ODBCConnOptions::CEKeystoreProvider, - sizeof(ODBCConnOptions::CEKeystoreProvider), - CONN_ATTR_STRING, - ce_ksp_provider_set_func::func - }, - { - PDOConnOptionNames::CEKeystoreName, - sizeof(PDOConnOptionNames::CEKeystoreName), - SQLSRV_CONN_OPTION_CEKEYSTORE_NAME, - ODBCConnOptions::CEKeystoreName, - sizeof(ODBCConnOptions::CEKeystoreName), - CONN_ATTR_STRING, - ce_ksp_provider_set_func::func - }, - { - PDOConnOptionNames::CEKeystoreEncryptKey, - sizeof(PDOConnOptionNames::CEKeystoreEncryptKey), - SQLSRV_CONN_OPTION_CEKEYSTORE_ENCRYPT_KEY, - ODBCConnOptions::CEKeystoreEncryptKey, - sizeof(ODBCConnOptions::CEKeystoreEncryptKey), - CONN_ATTR_STRING, - ce_ksp_provider_set_func::func - }, + { + PDOConnOptionNames::ColumnEncryption, + sizeof(PDOConnOptionNames::ColumnEncryption), + SQLSRV_CONN_OPTION_COLUMNENCRYPTION, + ODBCConnOptions::ColumnEncryption, + sizeof(ODBCConnOptions::ColumnEncryption), + CONN_ATTR_STRING, + column_encryption_set_func::func + }, + { + PDOConnOptionNames::CEKeystoreProvider, + sizeof(PDOConnOptionNames::CEKeystoreProvider), + SQLSRV_CONN_OPTION_CEKEYSTORE_PROVIDER, + ODBCConnOptions::CEKeystoreProvider, + sizeof(ODBCConnOptions::CEKeystoreProvider), + CONN_ATTR_STRING, + ce_ksp_provider_set_func::func + }, + { + PDOConnOptionNames::CEKeystoreName, + sizeof(PDOConnOptionNames::CEKeystoreName), + SQLSRV_CONN_OPTION_CEKEYSTORE_NAME, + ODBCConnOptions::CEKeystoreName, + sizeof(ODBCConnOptions::CEKeystoreName), + CONN_ATTR_STRING, + ce_ksp_provider_set_func::func + }, + { + PDOConnOptionNames::CEKeystoreEncryptKey, + sizeof(PDOConnOptionNames::CEKeystoreEncryptKey), + SQLSRV_CONN_OPTION_CEKEYSTORE_ENCRYPT_KEY, + ODBCConnOptions::CEKeystoreEncryptKey, + sizeof(ODBCConnOptions::CEKeystoreEncryptKey), + CONN_ATTR_STRING, + ce_ksp_provider_set_func::func + }, #ifdef _WIN32 { PDOConnOptionNames::ConnectRetryCount, diff --git a/source/shared/core_conn.cpp b/source/shared/core_conn.cpp index eae1d427..d8b31e11 100644 --- a/source/shared/core_conn.cpp +++ b/source/shared/core_conn.cpp @@ -779,7 +779,7 @@ void determine_server_version( _Inout_ sqlsrv_conn* conn TSRMLS_DC ) } // Column Encryption feature: if a custom keystore provider is specified, -// load and configure it when column encryption is enabled, but this step have +// load and configure it when column encryption is enabled, but this step has // to be executed after the connection has been established void load_configure_ksp( _Inout_ sqlsrv_conn* conn TSRMLS_DC ) { @@ -826,7 +826,7 @@ void load_configure_ksp( _Inout_ sqlsrv_conn* conn TSRMLS_DC ) wksp_name = utf16_string_from_mbcs_string( SQLSRV_ENCODING_UTF8, ksp_name, name_len, &wname_len ); CHECK_CUSTOM_ERROR( wksp_name == 0, conn, SQLSRV_ERROR_CONNECT_STRING_ENCODING_TRANSLATE ) { - throw core::CoreException(); + throw core::CoreException(); } pKsd->name = (wchar_t *) wksp_name.get(); @@ -839,7 +839,7 @@ void load_configure_ksp( _Inout_ sqlsrv_conn* conn TSRMLS_DC ) core::SQLSetConnectAttr( conn, SQL_COPT_SS_CEKEYSTOREDATA, reinterpret_cast( pKsd ), SQL_IS_POINTER ); } -void common_conn_str_append_func( const char* odbc_name, const char* val, size_t val_len, std::string& conn_str TSRMLS_DC ) +void common_conn_str_append_func( _In_z_ const char* odbc_name, _In_reads_(val_len) const char* val, _Inout_ size_t val_len, _Inout_ std::string& conn_str TSRMLS_DC ) { // wrap a connection option in a quote. It is presumed that any character that need to be escaped will // be escaped, such as a closing }. diff --git a/source/sqlsrv/conn.cpp b/source/sqlsrv/conn.cpp index 32afc87d..92698dd1 100644 --- a/source/sqlsrv/conn.cpp +++ b/source/sqlsrv/conn.cpp @@ -298,51 +298,51 @@ const connection_option SS_CONN_OPTS[] = { CONN_ATTR_STRING, conn_str_append_func::func }, - { - SSConnOptionNames::ConnectionPooling, - sizeof(SSConnOptionNames::ConnectionPooling), - SQLSRV_CONN_OPTION_CONN_POOLING, - ODBCConnOptions::ConnectionPooling, - sizeof(ODBCConnOptions::ConnectionPooling), - CONN_ATTR_BOOL, - conn_null_func::func - }, - { - SSConnOptionNames::ColumnEncryption, - sizeof(SSConnOptionNames::ColumnEncryption), - SQLSRV_CONN_OPTION_COLUMNENCRYPTION, - ODBCConnOptions::ColumnEncryption, - sizeof(ODBCConnOptions::ColumnEncryption), - CONN_ATTR_STRING, - column_encryption_set_func::func - }, - { - SSConnOptionNames::CEKeystoreProvider, - sizeof(SSConnOptionNames::CEKeystoreProvider), - SQLSRV_CONN_OPTION_CEKEYSTORE_PROVIDER, - ODBCConnOptions::CEKeystoreProvider, - sizeof(ODBCConnOptions::CEKeystoreProvider), - CONN_ATTR_STRING, - ce_ksp_provider_set_func::func - }, - { - SSConnOptionNames::CEKeystoreName, - sizeof(SSConnOptionNames::CEKeystoreName), - SQLSRV_CONN_OPTION_CEKEYSTORE_NAME, - ODBCConnOptions::CEKeystoreName, - sizeof(ODBCConnOptions::CEKeystoreName), - CONN_ATTR_STRING, - ce_ksp_provider_set_func::func - }, - { - SSConnOptionNames::CEKeystoreEncryptKey, - sizeof(SSConnOptionNames::CEKeystoreEncryptKey), - SQLSRV_CONN_OPTION_CEKEYSTORE_ENCRYPT_KEY, - ODBCConnOptions::CEKeystoreEncryptKey, - sizeof(ODBCConnOptions::CEKeystoreEncryptKey), - CONN_ATTR_STRING, - ce_ksp_provider_set_func::func - }, + { + SSConnOptionNames::ConnectionPooling, + sizeof(SSConnOptionNames::ConnectionPooling), + SQLSRV_CONN_OPTION_CONN_POOLING, + ODBCConnOptions::ConnectionPooling, + sizeof(ODBCConnOptions::ConnectionPooling), + CONN_ATTR_BOOL, + conn_null_func::func + }, + { + SSConnOptionNames::ColumnEncryption, + sizeof(SSConnOptionNames::ColumnEncryption), + SQLSRV_CONN_OPTION_COLUMNENCRYPTION, + ODBCConnOptions::ColumnEncryption, + sizeof(ODBCConnOptions::ColumnEncryption), + CONN_ATTR_STRING, + column_encryption_set_func::func + }, + { + SSConnOptionNames::CEKeystoreProvider, + sizeof(SSConnOptionNames::CEKeystoreProvider), + SQLSRV_CONN_OPTION_CEKEYSTORE_PROVIDER, + ODBCConnOptions::CEKeystoreProvider, + sizeof(ODBCConnOptions::CEKeystoreProvider), + CONN_ATTR_STRING, + ce_ksp_provider_set_func::func + }, + { + SSConnOptionNames::CEKeystoreName, + sizeof(SSConnOptionNames::CEKeystoreName), + SQLSRV_CONN_OPTION_CEKEYSTORE_NAME, + ODBCConnOptions::CEKeystoreName, + sizeof(ODBCConnOptions::CEKeystoreName), + CONN_ATTR_STRING, + ce_ksp_provider_set_func::func + }, + { + SSConnOptionNames::CEKeystoreEncryptKey, + sizeof(SSConnOptionNames::CEKeystoreEncryptKey), + SQLSRV_CONN_OPTION_CEKEYSTORE_ENCRYPT_KEY, + ODBCConnOptions::CEKeystoreEncryptKey, + sizeof(ODBCConnOptions::CEKeystoreEncryptKey), + CONN_ATTR_STRING, + ce_ksp_provider_set_func::func + }, #ifdef _WIN32 { SSConnOptionNames::ConnectRetryCount, diff --git a/test/functional/setup/build_ksp.py b/test/functional/setup/build_ksp.py index 19655e0d..fb524719 100644 --- a/test/functional/setup/build_ksp.py +++ b/test/functional/setup/build_ksp.py @@ -13,7 +13,7 @@ # ksp_app.c (or any equivalent) # msodbcsql.h (odbc header file) # -# Execution: Run with command line with required options +# Execution: Run with command line with optional options # py build_ksp.py --KSP myKSP --APP ksp_app # ############################################################################################# @@ -46,14 +46,14 @@ def create_batch_file(arch, filename, command): # This invokes the newly created batch file to compile the code, # according to *arch* (either x86 or x64). The batch file will be # removed afterwards -def compile_KSP_windows(arch, ksp_name): +def compile_KSP_windows(arch, ksp_src): output = 'myKSP' if arch == 'x64': output = output + arch + '.dll' else: output = output + '.dll' - command = 'cl {0}.c /LD /MD /link /out:'.format(ksp_name) + output + command = 'cl {0} /LD /MD /link /out:'.format(ksp_src) + output batchfile = 'build_KSP.bat' create_batch_file(arch, batchfile, command) os.system(batchfile) @@ -65,37 +65,37 @@ def compile_KSP_windows(arch, ksp_name): # Otherwise, this will compile the code and generate a .so file. # # Output: A custom keystore provider created -def compile_KSP(ksp_name): - print('Compiling ', ksp_name) +def compile_KSP(ksp_src): + print('Compiling ', ksp_src) if platform.system() == 'Windows': - compile_KSP_windows('x64', ksp_name) - compile_KSP_windows('x86', ksp_name) + compile_KSP_windows('x64', ksp_src) + compile_KSP_windows('x86', ksp_src) else: - os.system('gcc -fshort-wchar -fPIC -o myKSP.so -shared {0}.c'.format(ksp_name)) + os.system('gcc -fshort-wchar -fPIC -o myKSP.so -shared {0}'.format(ksp_src)) # This compiles ksp app, which assumes the existence of the .dll or the .so file. # # In Windows, a batch file is created in order to compile the code. -def configure_KSP(app_name): - print('Compiling ', app_name) +def configure_KSP(app_src): + print('Compiling ', app_src) if platform.system() == 'Windows': - command = 'cl /MD {0}.c /link odbc32.lib /out:ksp_app.exe'.format(app_name) + command = 'cl /MD {0} /link odbc32.lib /out:ksp_app.exe'.format(app_src) batchfile = 'build_app.bat' create_batch_file('x86', batchfile, command) os.system(batchfile) os.remove(batchfile) else: - os.system('gcc -o ksp_app -fshort-wchar {0}.c -lodbc -ldl'.format(app_name)) + os.system('gcc -o ksp_app -fshort-wchar {0} -lodbc -ldl'.format(app_src)) ################################### Main Function ################################### if __name__ == '__main__': parser = argparse.ArgumentParser() - parser.add_argument('-ksp', '--KSPNAME', default='myKSP', help='The KSP (keystore provider)') - parser.add_argument('-app', '--APPNAME', default='ksp_app', help='The app that uses the KSP') + parser.add_argument('-ksp', '--KSPSRC', default='myKSP.c', help='The source file of KSP (keystore provider)') + parser.add_argument('-app', '--APPSRC', default='ksp_app.c', help='The source file for the app that uses the KSP') args = parser.parse_args() - ksp_name = args.KSPNAME - app_name = args.APPNAME + ksp_src = args.KSPSRC + app_src = args.APPSRC header = 'msodbcsql.h' cwd = os.getcwd() @@ -107,15 +107,15 @@ if __name__ == '__main__': if not os.path.exists(os.path.join(work_dir, header)): print('Error: {0} not found!'.format(header)) exit(1) - if not os.path.exists(os.path.join(work_dir, ksp_name + '.c')): - print('Error: {0}.c not found!'.format(ksp_name)) + if not os.path.exists(os.path.join(work_dir, ksp_src)): + print('Error: {0}.c not found!'.format(ksp_src)) exit(1) - if not os.path.exists(os.path.join(work_dir, app_name + '.c')): - print('Error: {0}.c not found!'.format(app_name)) + if not os.path.exists(os.path.join(work_dir, app_src)): + print('Error: {0}.c not found!'.format(app_src)) exit(1) - compile_KSP(ksp_name) - configure_KSP(app_name) + compile_KSP(ksp_src) + configure_KSP(app_src) os.chdir(cwd) diff --git a/test/functional/setup/ksp_app.c b/test/functional/setup/ksp_app.c index 882fe3d5..9957fc12 100644 --- a/test/functional/setup/ksp_app.c +++ b/test/functional/setup/ksp_app.c @@ -72,6 +72,7 @@ int setKSPLibrary(SQLHSTMT stmt) { unsigned char CEK[32]; unsigned char *ECEK; unsigned short ECEKlen; + unsigned char foundProv = 0; int i; #ifdef _WIN32 HMODULE hProvLib; @@ -100,12 +101,16 @@ int setKSPLibrary(SQLHSTMT stmt) { return 3; } while (pKsp = *ppKsp++) { - if (!memcmp(KSPNAME, pKsp->Name, sizeof(KSPNAME))) - goto FoundProv; + if (!memcmp(KSPNAME, pKsp->Name, sizeof(KSPNAME))) { + foundProv = 1; + break; + } } - fprintf(stderr, "Could not find provider in the library\n"); - return 4; -FoundProv: + if (! foundProv) { + fprintf(stderr, "Could not find provider in the library\n"); + return 4; + } + if (pKsp->Init && !pKsp->Init(&ctx, postKspError)) { fprintf(stderr, "Could not initialize provider\n"); return 5;