Skip to content

Commit

Permalink
Fix of crashes caused by relying on C/C internal features, changed in
Browse files Browse the repository at this point in the history
3.0. In this case that was setting length_value of param bind structure,
and not letting length buffer pointer. Older C/C does that, if length is
NULL.
Changed some helper functions parameters to "const" to avoid warnings,
and just because that is right.
  • Loading branch information
lawrinn committed Oct 27, 2016
1 parent 9eab0b8 commit 609489d
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 24 deletions.
8 changes: 4 additions & 4 deletions ma_platform_posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ SQLINTEGER SqlwcsOctetLen(SQLWCHAR *str, SQLINTEGER *CharLen)
}


SQLWCHAR *MADB_ConvertToWchar(char *Ptr, SQLLEN PtrLength, Client_Charset* cc)
SQLWCHAR *MADB_ConvertToWchar(const char *Ptr, SQLLEN PtrLength, Client_Charset* cc)
{
SQLWCHAR *WStr= NULL;
size_t Length= 0;
Expand Down Expand Up @@ -173,7 +173,7 @@ SQLWCHAR *MADB_ConvertToWchar(char *Ptr, SQLLEN PtrLength, Client_Charset* cc)


/* {{{ MADB_ConvertFromWChar */
char *MADB_ConvertFromWChar(SQLWCHAR *Ptr, SQLINTEGER PtrLength, SQLULEN *Length, Client_Charset *cc,
char *MADB_ConvertFromWChar(const SQLWCHAR *Ptr, SQLINTEGER PtrLength, SQLULEN *Length, Client_Charset *cc,
BOOL *Error)
{
char *AscStr;
Expand Down Expand Up @@ -241,7 +241,7 @@ char *MADB_ConvertFromWChar(SQLWCHAR *Ptr, SQLINTEGER PtrLength, SQLULEN *Length
@IsNull[in] - whether to copy terminating blank. The value has to be 1 or 0(TRUE/FALSE)
If AnsiString is negative, its value is neglected(null is copied)
@returns 1 in case of error, 0 otherwise */
int MADB_ConvertAnsi2Unicode(Client_Charset *cc, char *AnsiString, SQLLEN AnsiLength,
int MADB_ConvertAnsi2Unicode(Client_Charset *cc, const char *AnsiString, SQLLEN AnsiLength,
SQLWCHAR *UnicodeString, SQLLEN UnicodeLength,
SQLLEN *LengthIndicator, BOOL IsNull, MADB_Error *Error)
{
Expand Down Expand Up @@ -318,7 +318,7 @@ int MADB_ConvertAnsi2Unicode(Client_Charset *cc, char *AnsiString, SQLLEN AnsiLe
/* {{{ MADB_ConvertAnsi2Unicode
@returns number of characters available at Src */
SQLLEN MADB_SetString(Client_Charset* cc, void *Dest, SQLULEN DestLength,
char *Src, SQLLEN SrcLength/*bytes*/, MADB_Error *Error)
const char *Src, SQLLEN SrcLength/*bytes*/, MADB_Error *Error)
{
SQLLEN Length= 0;

Expand Down
8 changes: 4 additions & 4 deletions ma_platform_win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ int DSNPrompt_Free(MADB_Prompt *prompt)
}


SQLWCHAR *MADB_ConvertToWchar(char *Ptr, SQLLEN PtrLength, Client_Charset* cc)
SQLWCHAR *MADB_ConvertToWchar(const char *Ptr, SQLLEN PtrLength, Client_Charset* cc)
{
SQLWCHAR *WStr= NULL;
int Length;
Expand Down Expand Up @@ -124,7 +124,7 @@ SQLWCHAR *MADB_ConvertToWchar(char *Ptr, SQLLEN PtrLength, Client_Charset* cc)
}

/* {{{ MADB_ConvertFromWChar */
char *MADB_ConvertFromWChar(SQLWCHAR *Wstr, SQLINTEGER WstrCharLen, SQLULEN *Length/*Bytes*/, Client_Charset *cc, BOOL *Error)
char *MADB_ConvertFromWChar(const SQLWCHAR *Wstr, SQLINTEGER WstrCharLen, SQLULEN *Length/*Bytes*/, Client_Charset *cc, BOOL *Error)
{
char *AscStr;
int AscLen, AllocLen;
Expand Down Expand Up @@ -158,7 +158,7 @@ char *MADB_ConvertFromWChar(SQLWCHAR *Wstr, SQLINTEGER WstrCharLen, SQLULEN *Len
/* }}} */


int MADB_ConvertAnsi2Unicode(Client_Charset *cc, char *AnsiString, SQLLEN AnsiLength,
int MADB_ConvertAnsi2Unicode(Client_Charset *cc, const char *AnsiString, SQLLEN AnsiLength,
SQLWCHAR *UnicodeString, SQLLEN UnicodeLength,
SQLLEN *LengthIndicator, BOOL IsNull, MADB_Error *Error)
{
Expand Down Expand Up @@ -219,7 +219,7 @@ int MADB_ConvertAnsi2Unicode(Client_Charset *cc, char *AnsiString, SQLLEN AnsiLe


SQLLEN MADB_SetString(Client_Charset* cc, void *Dest, SQLULEN DestLength,
char *Src, SQLLEN SrcLength/*bytes*/, MADB_Error *Error)
const char *Src, SQLLEN SrcLength/*bytes*/, MADB_Error *Error)
{
char *p= (char *)Dest;
SQLLEN Length= 0;
Expand Down
35 changes: 23 additions & 12 deletions ma_statement.c
Original file line number Diff line number Diff line change
Expand Up @@ -978,6 +978,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
{
Stmt->params[i-ParamOffset].buffer= ApdRecord->DefaultValue;
Stmt->params[i-ParamOffset].length_value= (unsigned long)strlen(ApdRecord->DefaultValue);
Stmt->params[i-ParamOffset].length= &Stmt->params[i-ParamOffset].length_value;
Stmt->params[i-ParamOffset].buffer_type= MYSQL_TYPE_STRING;
}
}
Expand All @@ -995,15 +996,21 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
{
if (DataPtr)
{
if (ApdRecord->ConciseType == SQL_C_WCHAR)
switch (ApdRecord->ConciseType)
{
case SQL_C_WCHAR:
Length= SqlwcsLen((SQLWCHAR *)DataPtr) * sizeof(SQLWCHAR);
else if (ApdRecord->ConciseType == SQL_C_CHAR)
break;
case SQL_C_CHAR:
case SQL_BINARY:
case SQL_LONGVARBINARY:
Length= strlen((SQLCHAR *)DataPtr);
}
}
if (!OctetLengthPtr && ApdRecord->OctetLength && ApdRecord->OctetLength != SQL_SETPARAM_VALUE_MAX)
Length= MIN(Length, ApdRecord->OctetLength);
}
Stmt->params[i-ParamOffset].length= 0;
Stmt->params[i-ParamOffset].length= NULL;

switch (ApdRecord->ConciseType) {
case SQL_C_WCHAR:
Expand Down Expand Up @@ -1117,6 +1124,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
ApdRecord->InternalBuffer= (void *)tm;
Stmt->params[i-ParamOffset].buffer= ApdRecord->InternalBuffer;
Stmt->params[i-ParamOffset].length_value= sizeof(MYSQL_TIME);
Stmt->params[i-ParamOffset].length= &Stmt->params[i-ParamOffset].length_value;
}
break;
case SQL_C_TIME:
Expand Down Expand Up @@ -1144,6 +1152,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
Stmt->params[i-ParamOffset].buffer_type= MYSQL_TYPE_DATETIME;
Stmt->params[i-ParamOffset].buffer= ApdRecord->InternalBuffer;
Stmt->params[i-ParamOffset].length_value= sizeof(MYSQL_TIME);
Stmt->params[i-ParamOffset].length= &Stmt->params[i-ParamOffset].length_value;
}
break;
case SQL_C_DATE:
Expand All @@ -1167,23 +1176,21 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
Stmt->params[i-ParamOffset].buffer_type= MYSQL_TYPE_DATE;
Stmt->params[i-ParamOffset].buffer= ApdRecord->InternalBuffer;
Stmt->params[i-ParamOffset].length_value= sizeof(MYSQL_TIME);
Stmt->params[i-ParamOffset].length= &Stmt->params[i-ParamOffset].length_value;
}
break;
case SQL_BINARY:
case SQL_LONGVARBINARY:
{
SQLLEN *length= (SQLLEN *)GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->OctetLengthPtr, j - Start, sizeof(SQLLEN));

Stmt->params[i-ParamOffset].buffer= (char *)GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->DataPtr, j - Start, ApdRecord->OctetLength);
Stmt->params[i-ParamOffset].buffer= (char *)DataPtr;

if (length && *length == SQL_NTS)
*length= strlen((char *)Stmt->params[i-ParamOffset].buffer);

if (length)
Stmt->params[i-ParamOffset].length_value= (unsigned long)*length;
if (OctetLengthPtr)
Stmt->params[i-ParamOffset].length_value= (unsigned long)Length;
else
Stmt->params[i-ParamOffset].length_value= (unsigned long)ApdRecord->OctetLength;

Stmt->params[i-ParamOffset].length= &Stmt->params[i-ParamOffset].length_value;

Stmt->params[i-ParamOffset].buffer_type= MYSQL_TYPE_BLOB;
}
break;
Expand All @@ -1194,8 +1201,11 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
Stmt->params[i-ParamOffset].buffer_type= MADB_GetTypeAndLength(ApdRecord->ConciseType,
&Stmt->params[i-ParamOffset].is_unsigned, &Stmt->params[i-ParamOffset].buffer_length);
if (!ApdRecord->OctetLength)
{
ApdRecord->OctetLength= Stmt->params[i-ParamOffset].buffer_length;
Stmt->params[i-ParamOffset].buffer= GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->DataPtr, j - Start, ApdRecord->OctetLength);
DataPtr= GetBindOffset(Stmt->Apd, ApdRecord, ApdRecord->DataPtr, j - Start, ApdRecord->OctetLength);
}
Stmt->params[i-ParamOffset].buffer= DataPtr;
}
}
}
Expand All @@ -1211,6 +1221,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
}
if (Stmt->ParamCount)
{
//TODO: mysql_stmt_bind_param(Stmt->stmt, Stmt->params);
memcpy(Stmt->stmt->params, Stmt->params, sizeof(MYSQL_BIND) * Stmt->ParamCount);
Stmt->stmt->send_types_to_server= 1;
}
Expand Down
8 changes: 4 additions & 4 deletions ma_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
#ifndef _ma_string_h_
#define _ma_string_h_

char *MADB_ConvertFromWChar(SQLWCHAR *Ptr, SQLINTEGER PtrLength, SQLULEN *Length, Client_Charset* cc, BOOL *DefaultCharUsed);
int MADB_ConvertAnsi2Unicode(Client_Charset* cc, char *AnsiString, SQLLEN AnsiLength,
char *MADB_ConvertFromWChar(const SQLWCHAR *Ptr, SQLINTEGER PtrLength, SQLULEN *Length, Client_Charset* cc, BOOL *DefaultCharUsed);
int MADB_ConvertAnsi2Unicode(Client_Charset* cc, const char *AnsiString, SQLLEN AnsiLength,
SQLWCHAR *UnicodeString, SQLLEN UnicodeLength,
SQLLEN *LengthIndicator, BOOL IsNull, MADB_Error *Error);
char* MADB_GetInsertStatement(MADB_Stmt *Stmt);
Expand All @@ -32,9 +32,9 @@ my_bool MADB_DynStrGetWhere(MADB_Stmt *Stmt, DYNAMIC_STRING *DynString, char *
my_bool MADB_DynStrAppendQuoted(DYNAMIC_STRING *DynString, char *String);
my_bool MADB_DynStrGetColumns(MADB_Stmt *Stmt, DYNAMIC_STRING *DynString);
my_bool MADB_DynStrGetValues(MADB_Stmt *Stmt, DYNAMIC_STRING *DynString);
SQLWCHAR* MADB_ConvertToWchar(char *Ptr, SQLLEN PtrLength, Client_Charset* cc);
SQLWCHAR* MADB_ConvertToWchar(const char *Ptr, SQLLEN PtrLength, Client_Charset* cc);
SQLLEN MADB_SetString(Client_Charset* cc, void *Dest, SQLULEN DestLength,
char *Src, SQLLEN SrcLength, MADB_Error *Error);
const char *Src, SQLLEN SrcLength, MADB_Error *Error);
my_bool MADB_ValidateStmt(char *StmtStr);
my_bool MADB_IsStatementSupported(char *StmtStr, char *token1, char *token2);

Expand Down

0 comments on commit 609489d

Please sign in to comment.