Skip to content

Commit

Permalink
Fix memory leaks
Browse files Browse the repository at this point in the history
  • Loading branch information
Israel Brewster authored and bendailey committed Dec 1, 2015
1 parent bfeb4ea commit 81e107e
Show file tree
Hide file tree
Showing 13 changed files with 84 additions and 40 deletions.
Empty file modified lib4d_sql/base64.c
100644 → 100755
Empty file.
Empty file modified lib4d_sql/base64.h
100644 → 100755
Empty file.
1 change: 1 addition & 0 deletions lib4d_sql/communication.c
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,7 @@ int socket_receiv_data(FOURD *cnx,FOURD_RESULT *state)
}
}
Printf("---Fin de socket_receiv_data\n");
free(colType);
return 0;
}
int socket_receiv_update_count(FOURD *cnx,FOURD_RESULT *state)
Expand Down
66 changes: 27 additions & 39 deletions lib4d_sql/fourd.c
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@

#include "fourd.h"
#include "fourd_int.h"
#include "base64.h"

FOURD* fourd_init()
{
Expand Down Expand Up @@ -116,6 +115,9 @@ void fourd_free(FOURD* cnx)
#ifdef WIN32
WSACleanup();
#endif
if (cnx->preferred_image_types!=NULL)
free(cnx->preferred_image_types);

free(cnx);
}

Expand Down Expand Up @@ -157,6 +159,7 @@ void fourd_free_result(FOURD_RESULT *res)
{
if(res!=NULL && res->elmt!=NULL)
_free_data_result(res);
free(res->row_type.Column);
Free(res);
}
int fourd_next_row(FOURD_RESULT *res)
Expand Down Expand Up @@ -238,6 +241,12 @@ void * fourd_field(FOURD_RESULT *res,unsigned int numCol)
return elmt->pValue;
}

//This function is for use by the python 4d driver, as it appears to be the only
//way to get this block of memory freed. Hopefully that will change.
void _free_field_string(char **value){
free(*value);
}

int fourd_field_to_string(FOURD_RESULT *res,unsigned int numCol,char **value,size_t *len)
{
unsigned int nbCol=res->row_type.nbColumn;
Expand Down Expand Up @@ -367,11 +376,28 @@ int fourd_num_columns(FOURD_RESULT *res)
return res->row_type.nbColumn;
}

void fourd_free_statement(FOURD_STATEMENT *state){
if (state->query!=NULL)
free(state->query);

if(state->elmt!=NULL)
free(state->elmt);

if (state->preferred_image_types!=NULL)
free(state->preferred_image_types);

free(state);
}

FOURD_STATEMENT * fourd_prepare_statement(FOURD *cnx,const char *query)
{
FOURD_STATEMENT* state=NULL;
if(cnx==NULL || !cnx->connected || query==NULL)
return NULL;

if(_prepare_statement(cnx, 3, query)!=0)
return NULL;

state=calloc(1,sizeof(FOURD_STATEMENT));
state->cnx=cnx;
state->query=(char *)malloc(strlen(query)+1);
Expand All @@ -385,44 +411,6 @@ FOURD_STATEMENT * fourd_prepare_statement(FOURD *cnx,const char *query)
sprintf(state->query,"%s",query);
fourd_set_statement_preferred_image_types(state,cnx->preferred_image_types);


char *msg;
FOURD_RESULT *res=calloc(1,sizeof(FOURD_RESULT));
unsigned char *request_b64;
int len;

request_b64=base64_encode(query,strlen(query),&len);
char *format_str="003 PREPARE-STATEMENT\r\nSTATEMENT-BASE64:%s\r\n\r\n";
unsigned long buff_size=strlen(format_str)+strlen((const char *)request_b64)+2; //add some extra for good measure.
msg=(char *)malloc(buff_size);
snprintf(msg,buff_size,format_str,request_b64);
free(request_b64);

cnx->updated_row=-1;
socket_send(cnx,msg);
free(msg);

if(receiv_check(cnx,res)!=0)
return NULL;

switch(res->resultType) {
case UPDATE_COUNT:
//get Update-count: Nb row updated
cnx->updated_row=-1;
//socket_receiv_update_count(cnx,res);
_free_data_result(res);
break;
case RESULT_SET:
//get data
socket_receiv_data(cnx,res);
cnx->updated_row=-1;
break;
default:
Printferr("Error: Result-Type not supported in query");
}
free(res);


return state;
}

Expand Down
5 changes: 4 additions & 1 deletion lib4d_sql/fourd.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,11 @@ int fourd_errno(FOURD *cnx);
const char * fourd_error(FOURD *cnx);
const char * fourd_sqlstate(FOURD *cnx);
void fourd_free(FOURD* cnx);
void fourd_free_statement(FOURD_STATEMENT *state);
void fourd_timeout(FOURD* cnx,int timeout);
//For use by external non-c code that can't access/clear this block of memory
//directly.
void _free_field_string(char **value);

/*function on FOURD_RESULT*/
FOURD_LONG8 fourd_num_rows(FOURD_RESULT *result);
Expand All @@ -280,7 +284,6 @@ FOURD_TYPE fourd_get_column_type(FOURD_RESULT *res,unsigned int numCol);
int fourd_num_columns(FOURD_RESULT *res);
int fourd_field_to_string(FOURD_RESULT *res,unsigned int numCol,char **value,size_t *len);


FOURD_STATEMENT * fourd_prepare_statement(FOURD *cnx,const char *query);
int fourd_bind_param(FOURD_STATEMENT *state,unsigned int numParam,FOURD_TYPE type, void *val);
FOURD_RESULT *fourd_exec_statement(FOURD_STATEMENT *state, int res_size);
Expand Down
1 change: 1 addition & 0 deletions lib4d_sql/fourd_int.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ void _free_data_result(FOURD_RESULT *res);
void _clear_atrr_cnx(FOURD *cnx);
int close_statement(FOURD_RESULT *res,unsigned short int id_cmd);

int _prepare_statement(FOURD *cnx,unsigned short int id_cmd,const char *request);
int _query_param(FOURD *cnx,unsigned short int id_cmd, const char *request,unsigned int nbParam, const FOURD_ELEMENT *param,FOURD_RESULT *result,const char*image_type, int res_size);
int _is_multi_query(const char *request);
int _valid_query(FOURD *cnx,const char *request);
Expand Down
51 changes: 51 additions & 0 deletions lib4d_sql/fourd_interne.c
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,53 @@ int _query(FOURD *cnx,unsigned short int id_cmd,const char *request,FOURD_RESULT
return 0;
}

int _prepare_statement(FOURD *cnx,unsigned short int id_cmd,const char *request){
char *msg;
FOURD_RESULT *res=calloc(1,sizeof(FOURD_RESULT));
int len;

#if __STATEMENT_BASE64__
unsigned char *request_b64;
request_b64=base64_encode(request,strlen(request),&len);
char *format_str="%03d PREPARE-STATEMENT\r\nSTATEMENT-BASE64: %s\r\n\r\n";
unsigned long buff_size=strlen(format_str)+strlen((const char *)request_b64)+2; //add some extra for good measure.
msg=(char *)malloc(buff_size);
snprintf(msg,buff_size,format_str,id_cmd,request_b64);
free(request_b64);
#else
char *format_str="%03d PREPARE-STATEMENT\r\nSTATEMENT: %s\r\n\r\n";
unsigned long buff_size=strlen(format_str)+strlen(request)+2; //add some extra for good measure.
msg=(char *)malloc(buff_size);
snprintf(msg,buff_size,format_str,id_cmd,request_b64);
#endif

cnx->updated_row=-1;
socket_send(cnx,msg);
free(msg);

if(receiv_check(cnx,res)!=0)
return 1;

switch(res->resultType) {
case UPDATE_COUNT:
//get Update-count: Nb row updated
cnx->updated_row=-1;
//socket_receiv_update_count(cnx,res);
_free_data_result(res);
break;
case RESULT_SET:
//get data
socket_receiv_data(cnx,res);
cnx->updated_row=-1;
break;
default:
Printferr("Error: Result-Type not supported in query");
}
fourd_free_result(res);

return 0;
}

int _query_param(FOURD *cnx,unsigned short int id_cmd, const char *request,unsigned int nbParam, const FOURD_ELEMENT *param,FOURD_RESULT *result,const char*image_type,int res_size)
{
char *msg=NULL;
Expand Down Expand Up @@ -264,6 +311,7 @@ int _query_param(FOURD *cnx,unsigned short int id_cmd, const char *request,unsig
Free(res);
return 0;
}

/* low level commande
command_index and statement_id is identify by result of execute statement commande */
int __fetch_result(FOURD *cnx,unsigned short int id_cmd,int statement_id,int command_index,unsigned int first_row,unsigned int last_row,FOURD_RESULT *result)
Expand Down Expand Up @@ -686,7 +734,10 @@ void _free_data_result(FOURD_RESULT *res)
break;
}
}

free(res->elmt);
}

void *_copy(FOURD_TYPE type,void *org)
{
void *buff=NULL;
Expand Down
Empty file modified lib4d_sql/fourd_result.c
100644 → 100755
Empty file.
Empty file modified lib4d_sql/fourd_type.c
100644 → 100755
Empty file.
Empty file modified lib4d_sql/fourd_type.h
100644 → 100755
Empty file.
Empty file modified lib4d_sql/sqlstate.c
100644 → 100755
Empty file.
Empty file modified lib4d_sql/utils.c
100644 → 100755
Empty file.
Empty file modified lib4d_sql/utils.h
100644 → 100755
Empty file.

0 comments on commit 81e107e

Please sign in to comment.