Crash while freeing holders
I have Vala code that uses libgda, but it crashes during the part when holders is freed. I also have c code that crashes when I try to free the holder. What am I doing wrong? Please help. Thanks.
Here's the Vala code:
using Gda;
int main (string[] args)
{
Gda.Connection conn;
Gda.init();
Gda.Holder holder;
try
{
conn = Gda.Connection.open_from_string ("SQLite",
"SQLite://DB_DIR=.;DB_NAME=test", null,
Gda.ConnectionOptions.NONE);
conn.execute_non_select_command ("""CREATE TABLE IF NOT EXISTS test (
id INTEGER PRIMARY KEY,
name TEXT);""");
string remain;
Gda.SqlParser parser = new Gda.SqlParser();
Gda.Statement s = parser.parse_string("INSERT INTO test (name) VALUES (##name::string);", out remain);
Gda.Set params;
Gda.Set row;
s.get_parameters(out params);
Value v_str = Value(typeof(string));
holder = params.get_holder("name");
v_str.set_string("John Doe");
holder.take_value(v_str);
conn.statement_execute_non_select(s, params, out row);
}
catch (Error e)
{
stderr.printf("%s\n", e.message);
return 1;
}
return 0;
}
Backtrace of Vala code:
Thread 1 "test_vala_gda" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 0x00007ffff7b003eb in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff7adf899 in __GI_abort () at abort.c:79
#2 0x00007ffff7b4a38e in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff7c733a5 "%s\n")
at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007ffff7b524dc in malloc_printerr (str=str@entry=0x7ffff7c71542 "free(): invalid size") at malloc.c:5332
#4 0x00007ffff7b53d0c in _int_free (av=<optimized out>, p=0x7fffffffdc90, have_lock=0) at malloc.c:4177
#5 0x00007ffff7d11975 in gda_holder_dispose (object=0x55555567fac0) at gda-holder.c:576
#6 0x00007ffff7e07b93 in g_object_unref () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#7 0x0000555555555f96 in _vala_main (args=0x7fffffffddd8, args_length1=1)
at ../../../../../../../../../Projects/test_vala_gda/src/main.vala:59
#8 0x0000555555556009 in main (argc=1, argv=0x7fffffffddd8) at ../../../../../../../../../Projects/test_vala_gda/src/main.vala:21
Here's the c code:
#include <libgda/libgda.h>
#include <libgda/sql-parser/gda-sql-parser.h>
#include <libgda/gda-blob-op.h>
int
main (int argc, char *argv[])
{
GdaConnection *cnc;
GError *error = NULL;
gint res;
cnc = gda_connection_open_from_string ("SQLite", "DB_DIR=.;DB_NAME=testblob", NULL,
GDA_CONNECTION_OPTIONS_NONE,
&error);
if (!cnc) {
g_print ("Could not open connection to SQLite database in testblob.db file: %s\n",
error && error->message ? error->message : "No detail");
exit (1);
}
GdaSqlParser *parser;
GdaStatement *stmt;
GdaSet *params, *newrow;
GdaHolder *holder;
GValue value = G_VALUE_INIT;
parser = gda_sql_parser_new ();
stmt = gda_sql_parser_parse_string (parser,
"INSERT INTO children (name) VALUES (##name::string)",
NULL, &error);
g_object_unref (parser);
if (!stmt)
return FALSE;
if (! gda_statement_get_parameters (stmt, ¶ms, &error)) {
g_object_unref (stmt);
return FALSE;
}
holder = gda_set_get_holder (params, "name");
g_value_init (&value, G_TYPE_STRING);
g_value_set_static_string (&value, "hehe");
g_assert (gda_holder_take_value (holder, &value, NULL));
res = gda_connection_statement_execute_non_select (cnc, stmt, params, &newrow, &error);
printf("%d\n", res);
if (holder)
g_object_unref(holder);
return 0;
}
Backtrace of c code:
Thread 1 "blob_example" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 0x00007ffff7b003eb in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff7adf899 in __GI_abort () at abort.c:79
#2 0x00007ffff7b4a38e in __libc_message
(action=action@entry=do_abort, fmt=fmt@entry=0x7ffff7c733a5 "%s\n")
at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007ffff7b524dc in malloc_printerr
(str=str@entry=0x7ffff7c750a0 "double free or corruption (out)")
at malloc.c:5332
#4 0x00007ffff7b54170 in _int_free
(av=0x7ffff7ca4b80 <main_arena>, p=0x7fffffffdd40, have_lock=<optimized out>) at malloc.c:4314
#5 0x00007ffff7e96975 in gda_holder_dispose (object=0x5555555b0420)
at gda-holder.c:576
#6 0x00007ffff7decb93 in g_object_unref ()
at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#7 0x00005555555554ff in main (argc=1, argv=0x7fffffffde58)
at blob_example.c:50