File libreoffice_fixes.patch of Package mariadb-connector-odbc

Fix crashes with OpenOffice

Upstream Bug: https://jira.mariadb.org/browse/ODBC-123
https://bugzilla.novell.com/show_bug.cgi?id=938195

commit a1e8995d0f8132663ed98a1b6333f2d53b3fe885
Author: Lawrin Novitsky <lawrin.novitsky@mariadb.com>
Date:   Wed Dec 27 21:46:48 2017 +0100

    [ODBC-123] Fix and testcase. LibreOffice sets SQL_ATTR_USE_BOOKMARKS
    attribute, but does not actually use bookmarks. The connector was not
    ready for that, and would throw wrongly error, and then crash.
    Fixed a number of compilation warnings.

commit cfb8e530fdabcd17b84a4609a1423fb51ffcea5a
Author: Lawrin <lawrin@deb9.lawrin.office>
Date:   Fri Jan 12 17:50:40 2018 -0500

    Addition to the fix of ODBC-123 and the testcase for that problem - for SQL_CATALOG_LOCATION info type the connector incorrectly wrote to the buffer SQLUINTEGER, while it has to be SQLUSMALLINT

diff --git a/ma_bulk.c b/ma_bulk.c
index 4008f55..f45a4bd 100644
--- a/ma_bulk.c
+++ b/ma_bulk.c
@@ -170,7 +170,7 @@ SQLRETURN MADB_SetBulkOperLengthArr(MADB_Stmt *Stmt, MADB_DescRecord *CRec, SQLL
 
     if (VariableLengthMadbType)
     {
-      MaBind->length[row]= MADB_CalculateLength(Stmt, OctetLengthPtr != NULL ? &OctetLengthPtr[row] : NULL, CRec, DataPtr);
+      MaBind->length[row]= (unsigned long)MADB_CalculateLength(Stmt, OctetLengthPtr != NULL ? &OctetLengthPtr[row] : NULL, CRec, DataPtr);
     }
   }
 
@@ -322,7 +322,7 @@ SQLRETURN MADB_ExecuteBulk(MADB_Stmt *Stmt, unsigned int ParamOffset)
         {
           if (Stmt->Apd->Header.ArrayStatusPtr[row] == SQL_PARAM_IGNORE)
           {
-            MADB_SetIndicatorValue(Stmt, &Stmt->params[IndIdx], row, SQL_PARAM_IGNORE);
+            MADB_SetIndicatorValue(Stmt, &Stmt->params[IndIdx], (unsigned int)row, SQL_PARAM_IGNORE);
           }
         }       
       }
diff --git a/ma_connection.c b/ma_connection.c
index 32be6bf..b18ed6d 100644
--- a/ma_connection.c
+++ b/ma_connection.c
@@ -1333,7 +1333,7 @@ SQLRETURN MADB_DbcGetInfo(MADB_Dbc *Dbc, SQLUSMALLINT InfoType, SQLPOINTER InfoV
     {
       size_t max_packet_size;
       mariadb_get_infov(Dbc->mariadb, MARIADB_MAX_ALLOWED_PACKET, &max_packet_size);
-      MADB_SET_NUM_VAL(SQLUINTEGER, InfoValuePtr, max_packet_size, StringLengthPtr);
+      MADB_SET_NUM_VAL(SQLUINTEGER, InfoValuePtr, (SQLUINTEGER)max_packet_size, StringLengthPtr);
     }
     break;
   case SQL_MAX_TABLE_NAME_LEN:
diff --git a/ma_desc.c b/ma_desc.c
index a432098..14f1dab 100644
--- a/ma_desc.c
+++ b/ma_desc.c
@@ -738,7 +738,7 @@ SQLRETURN MADB_DescGetField(SQLHDESC DescriptorHandle,
     *((SQLPOINTER *)ValuePtr)= (SQLPOINTER)Desc->Header.BindOffsetPtr;
     break;
   case SQL_DESC_BIND_TYPE:
-    *((SQLINTEGER *)ValuePtr)= Desc->Header.BindType;
+    *((SQLULEN *)ValuePtr)= Desc->Header.BindType;
     break;
   case SQL_DESC_COUNT:
     *(SQLSMALLINT *)ValuePtr= Desc->Header.Count;
diff --git a/ma_statement.c b/ma_statement.c
index 9b366a6..b1bea8e 100644
--- a/ma_statement.c
+++ b/ma_statement.c
@@ -459,7 +459,7 @@ SQLRETURN MADB_RegularPrepare(MADB_Stmt *Stmt)
 {
   LOCK_MARIADB(Stmt->Connection);
   MDBUG_C_PRINT(Stmt->Connection, "mysql_stmt_prepare(%0x,%s)", Stmt->stmt, Stmt->StmtString);
-  if (mysql_stmt_prepare(Stmt->stmt, Stmt->StmtString, strlen(Stmt->StmtString)))
+  if (mysql_stmt_prepare(Stmt->stmt, Stmt->StmtString, (unsigned long)strlen(Stmt->StmtString)))
   {
     /* Need to save error first */
     MADB_SetNativeError(&Stmt->Error, SQL_HANDLE_STMT, Stmt->stmt);
@@ -998,7 +998,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt, BOOL ExecDirect)
   unsigned int ParamOffset=   0; /* for multi statements */
   unsigned int Iterations=    1,
     /* Will use it for STMT_ATTR_ARRAY_SIZE and as indicator if we are deploying MariaDB bulk insert feature */
-    MariadbArrSize= MADB_BulkInsertPossible(Stmt) != FALSE ? Stmt->Apd->Header.ArraySize : 0;
+    MariadbArrSize= MADB_BulkInsertPossible(Stmt) != FALSE ? (unsigned int)Stmt->Apd->Header.ArraySize : 0;
   SQLULEN      j, Start=      0;
 
   MDBUG_C_PRINT(Stmt->Connection, "%sMADB_StmtExecute", "\t->");
@@ -1077,7 +1077,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt, BOOL ExecDirect)
       {
         /* Doing just the same thing as we would do in general case */
         MADB_CleanBulkOperData(Stmt, ParamOffset);
-        ErrorCount= Stmt->Apd->Header.ArraySize;
+        ErrorCount= (unsigned int)Stmt->Apd->Header.ArraySize;
         MADB_SetStatusArray(Stmt, SQL_PARAM_DIAG_UNAVAILABLE);
         goto end;
       }
@@ -1087,7 +1087,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt, BOOL ExecDirect)
       }
       /* Suboptimal, but more reliable and simple */
       MADB_CleanBulkOperData(Stmt, ParamOffset);
-      Stmt->ArrayOffset+= Stmt->Apd->Header.ArraySize;
+      Stmt->ArrayOffset+= (int)Stmt->Apd->Header.ArraySize;
       if (Stmt->Ipd->Header.RowsProcessedPtr)
       {
         *Stmt->Ipd->Header.RowsProcessedPtr= *Stmt->Ipd->Header.RowsProcessedPtr + Stmt->Apd->Header.ArraySize;
@@ -1851,7 +1851,7 @@ SQLRETURN MADB_StmtFetch(MADB_Stmt *Stmt)
     return MADB_SetError(&Stmt->Error, MADB_ERR_24000, NULL, 0);
   }
 
-  if ((Stmt->Options.UseBookmarks == SQL_UB_VARIABLE && Stmt->Options.BookmarkType != SQL_C_VARBOOKMARK) ||
+  if ((Stmt->Options.UseBookmarks == SQL_UB_VARIABLE && Stmt->Options.BookmarkType == SQL_C_BOOKMARK) ||
       (Stmt->Options.UseBookmarks != SQL_UB_VARIABLE && Stmt->Options.BookmarkType == SQL_C_VARBOOKMARK))
   {
     MADB_SetError(&Stmt->Error, MADB_ERR_07006, NULL, 0);
@@ -1930,7 +1930,7 @@ SQLRETURN MADB_StmtFetch(MADB_Stmt *Stmt)
     /************************ Bind! ********************************/  
     mysql_stmt_bind_result(Stmt->stmt, Stmt->result);
 
-    if (Stmt->Options.UseBookmarks)
+    if (Stmt->Options.UseBookmarks && Stmt->Options.BookmarkPtr != NULL)
     {
       /* TODO: Bookmark can be not only "unsigned long*", but also "unsigned char*". Can be determined by examining Stmt->Options.BookmarkType */
       long *p= (long *)Stmt->Options.BookmarkPtr;
@@ -2059,7 +2059,7 @@ SQLRETURN MADB_StmtGetAttr(MADB_Stmt *Stmt, SQLINTEGER Attribute, SQLPOINTER Val
     *(SQLPOINTER *)ValuePtr= Stmt->Apd->Header.BindOffsetPtr;
     break;
   case SQL_ATTR_PARAM_BIND_TYPE:
-    *(SQLINTEGER *)ValuePtr= Stmt->Apd->Header.BindType;
+    *(SQLULEN *)ValuePtr= Stmt->Apd->Header.BindType;
     break;
   case SQL_ATTR_PARAM_OPERATION_PTR:
     *(SQLPOINTER *)ValuePtr= (SQLPOINTER)Stmt->Apd->Header.ArrayStatusPtr;
@@ -2084,7 +2084,7 @@ SQLRETURN MADB_StmtGetAttr(MADB_Stmt *Stmt, SQLINTEGER Attribute, SQLPOINTER Val
     *(SQLPOINTER *)ValuePtr= (SQLPOINTER)Stmt->Ard->Header.BindOffsetPtr;
     break;
   case SQL_ATTR_ROW_BIND_TYPE:
-    *(SQLINTEGER *)ValuePtr= Stmt->Ard->Header.BindType;
+    *(SQLULEN *)ValuePtr= Stmt->Ard->Header.BindType;
     break;
   case SQL_ATTR_ROW_OPERATION_PTR:
     *(SQLPOINTER *)ValuePtr= (SQLPOINTER)Stmt->Ard->Header.ArrayStatusPtr;
@@ -2667,7 +2667,7 @@ SQLRETURN MADB_StmtGetData(SQLHSTMT StatementHandle,
 
           if (!Stmt->CharOffset[Offset])
           {
-            Stmt->Lengths[Offset]= CharLength*sizeof(SQLWCHAR);
+            Stmt->Lengths[Offset]= (unsigned long)(CharLength*sizeof(SQLWCHAR));
           }
         }
       }
@@ -2703,7 +2703,7 @@ SQLRETURN MADB_StmtGetData(SQLHSTMT StatementHandle,
       if (CharLength >= BufferLength / sizeof(SQLWCHAR))
       {
         /* Calculate new offset and substract 1 byte for null termination */
-        Stmt->CharOffset[Offset]+= BufferLength - sizeof(SQLWCHAR);
+        Stmt->CharOffset[Offset]+= (unsigned long)BufferLength - sizeof(SQLWCHAR);
         MADB_FREE(ClientValue);
 
         return MADB_SetError(&Stmt->Error, MADB_ERR_01004, NULL, 0);
diff --git a/ma_typeconv.c b/ma_typeconv.c
index 5ffc7cb..818bab1 100644
--- a/ma_typeconv.c
+++ b/ma_typeconv.c
@@ -578,7 +578,7 @@ SQLRETURN MADB_ConvertC2Sql(MADB_Stmt *Stmt, MADB_DescRecord *CRec, void* DataPt
     MaBind->buffer_type=   0;
     MaBind->is_unsigned=   0;
 
-    *LengthPtr= Length;
+    *LengthPtr= (unsigned long)Length;
     MaBind->buffer_type= MADB_GetMaDBTypeAndLength(CRec->ConciseType,
       &MaBind->is_unsigned, &MaBind->buffer_length);
 
diff --git a/ma_connection.c b/ma_connection.c
index b18ed6d..1b57e2b 100644
--- a/ma_connection.c
+++ b/ma_connection.c
@@ -887,7 +887,7 @@ SQLRETURN MADB_DbcGetInfo(MADB_Dbc *Dbc, SQLUSMALLINT InfoType, SQLPOINTER InfoV
     MADB_SET_NUM_VAL(SQLUINTEGER, InfoValuePtr, 0, StringLengthPtr);
     break;
   case SQL_CATALOG_LOCATION:
-    MADB_SET_NUM_VAL(SQLUINTEGER, InfoValuePtr, SQL_CL_START, StringLengthPtr);
+    MADB_SET_NUM_VAL(SQLUSMALLINT, InfoValuePtr, SQL_CL_START, StringLengthPtr);
     break;
   case SQL_CATALOG_NAME:
     /* Todo: MyODBC Driver has a DSN configuration for diabling catalog usage: