diff options
-rw-r--r-- | lib/odbc/c_src/odbcserver.c | 60 | ||||
-rw-r--r-- | lib/odbc/test/odbc_start_SUITE.erl | 15 |
2 files changed, 41 insertions, 34 deletions
diff --git a/lib/odbc/c_src/odbcserver.c b/lib/odbc/c_src/odbcserver.c index 84c201a656..f4b0a5d8d0 100644 --- a/lib/odbc/c_src/odbcserver.c +++ b/lib/odbc/c_src/odbcserver.c @@ -564,7 +564,6 @@ static db_result_msg db_connect(byte *args, db_state *state) /* Close the connection to the database. Returns an ok or error message. */ static db_result_msg db_close_connection(db_state *state) { - int index; SQLRETURN result; diagnos diagnos; @@ -613,11 +612,7 @@ static db_result_msg db_end_tran(byte compleationtype, db_state *state) erlang term into the message buffer of the returned message-struct. */ static db_result_msg db_query(byte *sql, db_state *state) { - char *atom; - int num_of_rows, elements, update; - SQLSMALLINT num_of_columns; SQLRETURN result; - SQLINTEGER RowCountPtr; db_result_msg msg; diagnos diagnos; byte is_error[6]; @@ -701,12 +696,9 @@ static db_result_msg db_query(byte *sql, db_state *state) set. */ static db_result_msg db_select_count(byte *sql, db_state *state) { - SQLSMALLINT num_of_columns, intresult; + SQLSMALLINT num_of_columns; SQLLEN num_of_rows; - SQLRETURN result; diagnos diagnos; - db_result_msg msg; - int index; if (associated_result_set(state)) { clean_state(state); @@ -792,6 +784,9 @@ static db_result_msg db_select(byte *args, db_state *state) orientation = SQL_FETCH_NEXT; offset = atoi(strtok((char *)(args + sizeof(byte)), ";")); n = atoi(strtok(NULL, ";")); + break; + default: + DO_EXIT(EXIT_PARAM_ARRAY); } msg = encode_empty_message(); @@ -942,7 +937,7 @@ static db_result_msg db_describe_table(byte *sql, db_state *state) SQLSMALLINT num_of_columns; SQLCHAR name[MAX_NAME]; SQLSMALLINT name_len, sql_type, dec_digits, nullable; - SQLLEN size; + SQLULEN size; diagnos diagnos; int i; @@ -1294,8 +1289,7 @@ static db_result_msg encode_column_name_list(SQLSMALLINT num_of_columns, db_result_msg msg; SQLCHAR name[MAX_NAME]; SQLSMALLINT name_len, sql_type, dec_digits, nullable; - SQLLEN size; - SQLRETURN result; + SQLULEN size; msg = encode_empty_message(); @@ -1357,9 +1351,8 @@ static db_result_msg encode_column_name_list(SQLSMALLINT num_of_columns, static db_result_msg encode_value_list(SQLSMALLINT num_of_columns, db_state *state) { - int i, msg_len; + int i; SQLRETURN result; - db_result_msg list_result; db_result_msg msg; msg = encode_empty_message(); @@ -1402,9 +1395,8 @@ static db_result_msg encode_value_list_scroll(SQLSMALLINT num_of_columns, SQLINTEGER OffSet, int N, db_state *state) { - int i, j, msg_len; + int i, j; SQLRETURN result; - db_result_msg list_result; db_result_msg msg; msg = encode_empty_message(); @@ -1810,10 +1802,23 @@ static int read_exact(byte *buffer, int len) { #endif +static size_t length_buffer_to_size(byte length_buffer[LENGTH_INDICATOR_SIZE]) +{ + size_t size = 0, i; + + for (i = 0; i < LENGTH_INDICATOR_SIZE; ++i) { + size <<= 8; + size |= (unsigned char)length_buffer[i]; + } + + return size; +} + + /* Recieive (read) data from erlang on stdin */ static byte * receive_erlang_port_msg(void) { - int i, len = 0; + size_t len; byte *buffer; byte lengthstr[LENGTH_INDICATOR_SIZE]; @@ -1822,10 +1827,8 @@ static byte * receive_erlang_port_msg(void) { DO_EXIT(EXIT_STDIN_HEADER); } - for(i=0; i < LENGTH_INDICATOR_SIZE; i++) { - len <<= 8; - len |= lengthstr[i]; - } + + len = length_buffer_to_size(lengthstr); if (len <= 0 || len > 1024) { DO_EXIT(EXIT_STDIN_HEADER); @@ -1926,8 +1929,7 @@ static byte * receive_msg(int socket) #endif { byte lengthstr[LENGTH_INDICATOR_SIZE]; - size_t msg_len = 0; - int i; + size_t msg_len; byte *buffer = NULL; if(!receive_msg_part(socket, lengthstr, LENGTH_INDICATOR_SIZE)) { @@ -1935,10 +1937,7 @@ static byte * receive_msg(int socket) DO_EXIT(EXIT_SOCKET_RECV_HEADER); } - for(i = 0; i < LENGTH_INDICATOR_SIZE; i++) { - msg_len <<= 8; - msg_len |= lengthstr[i]; - } + msg_len = length_buffer_to_size(lengthstr); buffer = (byte *)safe_malloc(msg_len); @@ -2200,8 +2199,7 @@ static void init_driver(int erl_auto_commit_mode, int erl_trace_driver, static void init_param_column(param_array *params, byte *buffer, int *index, int num_param_values, db_state* state) { - int size, erl_type; - long user_type, precision, scale, length, dummy; + long user_type, precision, scale, length; long in_or_out; ei_decode_long(buffer, index, &user_type); @@ -2514,8 +2512,7 @@ static param_array * bind_parameter_arrays(byte *buffer, int *index, int cols, int num_param_values, db_state *state) { - int i, j, k, size, erl_type; - db_result_msg msg; + int i, j, size, erl_type; long dummy; void *Values; param_array *params; @@ -2601,7 +2598,6 @@ static db_column retrive_binary_data(db_column column, int column_nr, db_state *state) { char *outputptr; - char *sqlState; int blocklen, outputlen, result; diagnos diagnos; diff --git a/lib/odbc/test/odbc_start_SUITE.erl b/lib/odbc/test/odbc_start_SUITE.erl index a7bb1d0ffe..d75e615ed4 100644 --- a/lib/odbc/test/odbc_start_SUITE.erl +++ b/lib/odbc/test/odbc_start_SUITE.erl @@ -109,8 +109,8 @@ suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> case odbc_test_lib:odbc_check() of - ok -> [app, appup, start]; - Other -> [app, appup] + ok -> [app, appup, start, long_connection_line]; + _Other -> [app, appup] end. groups() -> @@ -168,3 +168,14 @@ start_odbc(Type) -> {error, odbc_not_started} -> test_server:fail(start_failed) end. + + +long_connection_line(doc)-> + ["Test a connection line longer than 127 characters"]; +long_connection_line(suite) -> []; +long_connection_line(_Config) -> + odbc:start(), + String133 = "unknown_odbc_parameter=01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", + {error, Reason} = odbc:connect(String133, []), + odbc:stop(), + ct:pal("Driver error reason: ~p",[Reason]). |