From fc1113261856b1f6f1ee280c1b23f0710abdff0e Mon Sep 17 00:00:00 2001 From: blumf Date: Fri, 31 Jul 2015 15:34:13 +0100 Subject: [PATCH] Platform agnostic column buffers Issues with integer sizes differing between 32 & 64-bit archs --- src/ls_firebird.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/ls_firebird.c b/src/ls_firebird.c index 9c94cee..1c17f2a 100644 --- a/src/ls_firebird.c +++ b/src/ls_firebird.c @@ -280,6 +280,13 @@ static int count_rows_affected(cur_data* cur) return res; } +static void *malloc_zero(size_t len) +{ + void *res = malloc(len); + memset(res, 0, len); + return res; +} + /* ** Executes a SQL statement. ** Returns @@ -353,37 +360,37 @@ static int conn_execute (lua_State *L) { dtype = (var->sqltype & ~1); /* drop flag bit for now */ switch(dtype) { case SQL_VARYING: - var->sqldata = (char *)malloc(sizeof(char)*var->sqllen + 2); + var->sqldata = (char *)malloc_zero(sizeof(char)*var->sqllen + 2); break; case SQL_TEXT: - var->sqldata = (char *)malloc(sizeof(char)*var->sqllen); + var->sqldata = (char *)malloc_zero(sizeof(char)*var->sqllen); break; case SQL_SHORT: - var->sqldata = (char *)malloc(sizeof(short)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_SHORT)); break; case SQL_LONG: - var->sqldata = (char *)malloc(sizeof(long)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_LONG)); break; case SQL_INT64: - var->sqldata = (char *)malloc(sizeof(ISC_INT64)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_INT64)); break; case SQL_FLOAT: - var->sqldata = (char *)malloc(sizeof(float)); + var->sqldata = (char *)malloc_zero(sizeof(float)); break; case SQL_DOUBLE: - var->sqldata = (char *)malloc(sizeof(double)); + var->sqldata = (char *)malloc_zero(sizeof(double)); break; case SQL_TYPE_TIME: - var->sqldata = (char *)malloc(sizeof(ISC_TIME)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_TIME)); break; case SQL_TYPE_DATE: - var->sqldata = (char *)malloc(sizeof(ISC_DATE)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_DATE)); break; case SQL_TIMESTAMP: - var->sqldata = (char *)malloc(sizeof(ISC_TIMESTAMP)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_TIMESTAMP)); break; case SQL_BLOB: - var->sqldata = (char *)malloc(sizeof(ISC_QUAD)); + var->sqldata = (char *)malloc_zero(sizeof(ISC_QUAD)); break; /* TODO : add extra data type handles here */ } @@ -622,10 +629,10 @@ static void push_column(lua_State *L, int i, cur_data *cur) { lua_pushlstring(L, cur->out_sqlda->sqlvar[i].sqldata, cur->out_sqlda->sqlvar[i].sqllen); break; case SQL_SHORT: - luasql_pushinteger(L, *(short*)(cur->out_sqlda->sqlvar[i].sqldata)); + luasql_pushinteger(L, *(ISC_SHORT*)(cur->out_sqlda->sqlvar[i].sqldata)); break; case SQL_LONG: - luasql_pushinteger(L, *(long*)(cur->out_sqlda->sqlvar[i].sqldata)); + luasql_pushinteger(L, *(ISC_LONG*)(cur->out_sqlda->sqlvar[i].sqldata)); break; case SQL_INT64: luasql_pushinteger(L, *(ISC_INT64*)(cur->out_sqlda->sqlvar[i].sqldata));