diff --git a/src/legacy.c b/src/legacy.c index 4b77b81..a4437cb 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -41,6 +41,7 @@ void sqlite3_exec_( const int ret_code = sqlite3_exec(db, zSql, xCallback, pArg, &pzErrMsg); free(zSql); + int *result = malloc(3*8); result[0] = ret_code; result[1] = 0; @@ -49,8 +50,10 @@ void sqlite3_exec_( result[4] = strlen(pzErrMsg); result[5] = 0; + // errmsg should be managed by user + add_object_to_release((void *) pzErrMsg); add_object_to_release((void *) result); - set_result_ptr((char *)result); + set_result_ptr((void *) result); } int sqlite3_exec( diff --git a/src/main.c b/src/main.c index f9490e1..18e568a 100644 --- a/src/main.c +++ b/src/main.c @@ -2452,8 +2452,8 @@ int sqlite3TempInMemory(const sqlite3 *db){ void sqlite3_errmsg_(sqlite3 *db) __EXPORT_NAME(sqlite3_errmsg) { const char *result = sqlite3_errmsg(db); - add_object_to_release((void *) result); - set_result_ptr((char *)result); + // result is managed by SQLite itself + set_result_ptr((void *) result); set_result_size(strlen(result)); } @@ -3460,7 +3460,7 @@ void sqlite3_open_v2_( result[2] = (int)ppDb; add_object_to_release((void *) result); - set_result_ptr((char *)result); + set_result_ptr((void *)result); } int sqlite3_open_v2( diff --git a/src/prepare.c b/src/prepare.c index 0100ffc..a42a2d1 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -788,11 +788,11 @@ void sqlite3_prepare_v2_( const char *zSql, /* UTF-8 encoded SQL statement. */ int nBytes /* Length of zSql in bytes. */ ) __EXPORT_NAME(sqlite3_prepare_v2) { - sqlite3_stmt *ppStmt; - const char *pzTail; + sqlite3_stmt *ppStmt = NULL; + const char *pzTail = NULL; const int ret_code = sqlite3_prepare_v2(db, zSql, nBytes, &ppStmt, &pzTail); - free((void *)zSql); + free((void *) zSql); int *result = (int *)malloc(3*8); result[0] = ret_code; @@ -800,7 +800,8 @@ void sqlite3_prepare_v2_( result[4] = (int)pzTail; result[5] = strlen(pzTail); - set_result_ptr((char *)result); + add_object_to_release((void *) result); + set_result_ptr((void *) result); } int sqlite3_prepare_v2( diff --git a/src/sqlite3.h b/src/sqlite3.h index 80780cb..7b230c4 100644 --- a/src/sqlite3.h +++ b/src/sqlite3.h @@ -37,9 +37,6 @@ #define __EXPORT_NAME(name) \ __attribute__((export_name(#name))) -void set_result_ptr(const char *ptr); -void set_result_size(int size); - /* ** Make sure we can call this stuff from C++. */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f6cc172..07d7b43 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4911,7 +4911,7 @@ const char **sqlite3CompileOptions(int *pnOpt); #ifndef __sqlite_unmodified_upstram void add_object_to_release(void *object); -void set_result_ptr(const char *ptr); +void set_result_ptr(void *ptr); void set_result_size(int size); #endif diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 0240038..5879664 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1113,7 +1113,8 @@ void sqlite3_column_blob_(sqlite3_stmt *pStmt, int i) __EXPORT_NAME(sqlite3_colu const char *blob = sqlite3_column_blob(pStmt, i); int blob_len = sqlite3_column_bytes(pStmt, i); - set_result_ptr((char *)blob); + // blob is managed by SQLite itself + set_result_ptr((void *)blob); set_result_size(blob_len); } @@ -1157,7 +1158,8 @@ void sqlite3_column_text_(sqlite3_stmt *pStmt, int i) __EXPORT_NAME(sqlite3_colu const unsigned char *text = sqlite3_column_text(pStmt, i); const unsigned int text_len = sqlite3_column_bytes(pStmt, i); - set_result_ptr((char *)text); + // test is managed by SQLite itself + set_result_ptr((void *) text); set_result_size(text_len); } @@ -1256,8 +1258,8 @@ static const void *columnName( void sqlite3_column_name_(sqlite3_stmt *pStmt, int N) __EXPORT_NAME(sqlite3_column_name) { const char *result = sqlite3_column_name(pStmt, N); - add_object_to_release((void *) result); - set_result_ptr((char *)result); + // result is managed by SQLite itself + set_result_ptr((void *)result); set_result_size(strlen(result)); } diff --git a/src/wrapper.c b/src/wrapper.c index bdd7eaa..0a2a787 100644 --- a/src/wrapper.c +++ b/src/wrapper.c @@ -3,7 +3,7 @@ #include -const char *RESULT_PTR; +void *RESULT_PTR; int RESULT_SIZE; cvector_vector_type(void *) OBJECTS_TO_RELEASE; @@ -27,7 +27,7 @@ void add_object_to_release(void *object) { cvector_push_back(OBJECTS_TO_RELEASE, object); } -void set_result_ptr(const char *ptr) { +void set_result_ptr(void *ptr) { RESULT_PTR = ptr; } @@ -39,7 +39,7 @@ int get_result_size(void) { return RESULT_SIZE; } -const char *get_result_ptr() { +void *get_result_ptr() { return RESULT_PTR; }