Public bug reported: == Comment: #0 - Xiao Yuan Li <xyua...@cn.ibm.com> - 2014-11-20 21:58:30 == ---Problem Description--- Ubuntu 14.04.1 libmyodbc 5.1.10-3 reset the row-count loop variable of user application to zero and it results in user application core dump ---uname output--- Linux (none) 3.13.0-39-generic #66-Ubuntu SMP Tue Oct 28 13:30:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux Machine Type = x64 ---Debugger--- A debugger is not configured ---Steps to Reproduce--- user application query multi-rows data from mysql, libmyodbc function "copy_ansi_result ()" will reset row-count loop variable "j" to 0. Then it will result in the return value of "SQLGetData()" is "SQL_NO_DATA". user application will core dump.
int fetch_all_data(SQLHSTMT V_OD_hstmt, DB_RES *res) { SQLRETURN V_OD_erg; // result of functions DB_ROW row = NULL; SQLUSMALLINT i; char *temp; #if USE_SQLLEN SQLLEN indicator; #else SQLINTEGER indicator; #endif long j; //GRID_LOG_DEBUG(("DEBUG: in fetch\n")); res->fetched_rows=malloc((res->row_count+1)*sizeof(char*)); if (!res->fetched_rows) { GRID_LOG(("ERROR: malloc memory error for fetch.")); return -1; } memset(res->fetched_rows, 0, (res->row_count+1)*sizeof(char*)); for(j=0;j<res->row_count;j++){//fetch each row V_OD_erg = SQLFetchScroll(V_OD_hstmt,SQL_FETCH_NEXT,0); if(!SQL_SUCCEEDED(V_OD_erg)){ free(res->fetched_rows); return -1; } row=malloc(res->field_count*sizeof(char*)); if (!row) { free(res->fetched_rows); GRID_LOG(("ERROR: malloc memory error for fetch(first).")); return -1; } memset(row, 0, res->field_count*sizeof(char*)); for (i = 1; i <= res->field_count; i++) {//get each column for each row V_OD_erg = SQLGetData(V_OD_hstmt, i, SQL_C_CHAR, NULL, 0, (SQLLEN *) (&indicator));//get the column length if (SQL_SUCCEEDED(V_OD_erg)) { /* Handle null columns */ if (indicator == SQL_NULL_DATA){ temp=malloc(1);//for some propramm use dbodbc_row[0] directly, not check if the result of dbodbc_fetch_row is NULL or not if (!temp) { free(res->fetched_rows); GRID_LOG(("ERROR: malloc memory error for fetch(third).")); return -1; } memset(temp, 0, 1); row[i-1]=temp; //GRID_LOG_DEBUG(("DEBUG: Column %u :NULL\n", i)); }else{ temp=malloc(indicator+1); if (!temp) { free(res->fetched_rows); GRID_LOG(("ERROR: malloc memory error for fetch(third).")); return -1; } memset(temp, 0, indicator+1); V_OD_erg = SQLGetData(V_OD_hstmt, i, SQL_C_CHAR, temp, indicator+1, (SQLLEN *) (&indicator));//get the column data row[i-1]=temp; //GRID_LOG_DEBUG(("DEBUG: Column %u [%d]: %s\n", i,indicator, temp)); } }else{ temp=malloc(1);//for some propramm use dbodbc_row[0] directly, not check if the result of dbodbc_fetch_row is NULL or not if (!temp) { free(res->fetched_rows); GRID_LOG(("ERROR: malloc memory error for fetch(third).")); return -1; } memset(temp, 0, 1); row[i-1]=temp; GRID_LOG(("ERROR: get the column length failed!\n")); } }//end for i //GRID_LOG_DEBUG(("DEBUG: Fetched [%d] Column\n", res->field_count)); res->fetched_rows[j]=row; }//end for j res->current_row_num=0; return 0; } ----following is gdb debug info--- please refer the following gdb info and i is res->field_count/j is res->row_count mysql> select id from lic_pollers order by id (this is the following query sql) -> ; +----+ | id | +----+ | 1 | | 2 | +----+ 2 rows in set (0.03 sec) 11/10/2014 12:16:09 AM - LIC field_count=1, row_count=2 484 fetch_ret=fetch_all_data(V_OD_hstmt,res); (gdb) s fetch_all_data (V_OD_hstmt=0x647280, res=0x647dc0) at database.c:669 669 DB_ROW row = NULL; (gdb) n 679 GRID_LOG_DEBUG(("DEBUG: in fetch\n")); (gdb) 11/10/2014 12:16:15 AM - LIC DEBUG: in fetch 680 res->fetched_rows=malloc((res->row_count+1)*sizeof(char*)); (gdb) watch i Hardware watchpoint 2: i (gdb) watch j Hardware watchpoint 3: j (gdb) n 681 if (!res->fetched_rows) { (gdb) n 685 memset(res->fetched_rows, 0, (res->row_count+1)*sizeof(char*)); (gdb) 686 for(j=0;j<res->row_count;j++){//fetch each row (gdb) Hardware watchpoint 3: j Old value = 140737488345312 New value = 0 0x000000000040728c in fetch_all_data (V_OD_hstmt=0x647280, res=0x647dc0) at database.c:686 686 for(j=0;j<res->row_count;j++){//fetch each row (gdb) 687 V_OD_erg = SQLFetchScroll(V_OD_hstmt,SQL_FETCH_NEXT,0); (gdb) 688 if(!SQL_SUCCEEDED(V_OD_erg)){ (gdb) 692 row=malloc(res->field_count*sizeof(char*)); (gdb) 693 if (!row) { (gdb) 698 memset(row, 0, res->field_count*sizeof(char*)); (gdb) 699 for (i = 1; i <= res->field_count; i++) {//get each column for each row (gdb) Hardware watchpoint 2: i Old value = 0 New value = 1 0x0000000000407342 in fetch_all_data (V_OD_hstmt=0x647280, res=0x647dc0) at database.c:699 699 for (i = 1; i <= res->field_count; i++) {//get each column for each row (gdb) 700 V_OD_erg = SQLGetData(V_OD_hstmt, i, SQL_C_CHAR, NULL, 0, (SQLLEN *) (&indicator));//get the column length (gdb) 701 if (SQL_SUCCEEDED(V_OD_erg)) { (gdb) 703 if (indicator == SQL_NULL_DATA){ (gdb) 714 temp=malloc(indicator+1); (gdb) 715 if (!temp) { (gdb) 720 memset(temp, 0, indicator+1); (gdb) 721 V_OD_erg = SQLGetData(V_OD_hstmt, i, SQL_C_CHAR, temp, indicator+1, (SQLLEN *) (&indicator));//get the column data (gdb) 722 row[i-1]=temp; (gdb) 723 GRID_LOG_DEBUG(("DEBUG: Column %u [%d]: %s\n", i,indicator, temp)); (gdb) 11/10/2014 12:17:05 AM - LIC DEBUG: Column 1 [1]: 1 699 for (i = 1; i <= res->field_count; i++) {//get each column for each row (gdb) Hardware watchpoint 2: i Old value = 1 New value = 2 0x0000000000407591 in fetch_all_data (V_OD_hstmt=0x647280, res=0x647dc0) at database.c:699 699 for (i = 1; i <= res->field_count; i++) {//get each column for each row (gdb) n 737 GRID_LOG_DEBUG(("DEBUG: Fetched [%d] Column\n", res->field_count)); (gdb) 11/10/2014 12:17:18 AM - LIC DEBUG: Fetched [1] Column 738 res->fetched_rows[j]=row; (gdb) 686 for(j=0;j<res->row_count;j++){//fetch each row (gdb) n Hardware watchpoint 3: j Old value = 0 New value = 1 0x00000000004075eb in fetch_all_data (V_OD_hstmt=0x647280, res=0x647dc0) at database.c:686 686 for(j=0;j<res->row_count;j++){//fetch each row (gdb) 687 V_OD_erg = SQLFetchScroll(V_OD_hstmt,SQL_FETCH_NEXT,0); (gdb) 688 if(!SQL_SUCCEEDED(V_OD_erg)){ (gdb) n 692 row=malloc(res->field_count*sizeof(char*)); (gdb) n 693 if (!row) { (gdb) n 698 memset(row, 0, res->field_count*sizeof(char*)); (gdb) 699 for (i = 1; i <= res->field_count; i++) {//get each column for each row (gdb) Hardware watchpoint 2: i Old value = 2 New value = 1 0x0000000000407342 in fetch_all_data (V_OD_hstmt=0x647280, res=0x647dc0) at database.c:699 699 for (i = 1; i <= res->field_count; i++) {//get each column for each row (gdb) n 700 V_OD_erg = SQLGetData(V_OD_hstmt, i, SQL_C_CHAR, NULL, 0, (SQLLEN *) (&indicator));//get the column length (gdb) Hardware watchpoint 3: j Old value = 1 New value = 0 0x00007ffff6aa3685 in copy_ansi_result () from /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so Userspace tool common name: libmyodbc The userspace tool has the following bit modes: 64-bit Userspace rpm: libmyodbc-5.1.10-3 Userspace tool obtained from project website: na ** Affects: ubuntu Importance: Undecided Status: New ** Tags: architecture-x8664 bugnameltc-119128 severity-critical targetmilestone-inin14041 ** Tags added: architecture-x8664 bugnameltc-119128 severity-critical targetmilestone-inin14041 -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1394866 Title: Ubuntu 14.04.1 libmyodbc 5.1.10-3 bug To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+bug/1394866/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs