Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.6.1
-
None
-
Used with Cassandra 0.8.4 on Linux 2.6.32 with x86_64
Description
The generated cassandra.c cassandra_client_recv_get_slice() code for list processing instantiates an object of TYPE_COLUMN_OR_SUPER_COLUMN then calls thrift_struct_read() as in the following code snippet:
switch (fid) { case 0: if (ftype == T_LIST) { { guint32 size; ThriftType element_type; if ((ret = thrift_protocol_read_list_begin (protocol, &element_type, &size, error)) < 0) return 0; xfer += ret; /* iterate through list elements */ guint32 i; for (i = 0; i < size; i++) { ColumnOrSuperColumn * _elem19; _elem19 = g_object_new (TYPE_COLUMN_OR_SUPER_COLUMN, NULL); //printf("\nrecv_slice made %p\n", _elem19->column); if ((ret = thrift_struct_read (THRIFT_STRUCT (_elem19), protocol, error)) < 0)
When the object of TYPE_COLUMN_OR_SUPER_COLUMN is instantiated, it in turn instantiates a child of TYPE_COLUMN:
void column_or_super_column_instance_init (ColumnOrSuperColumn * object) { /* satisfy -Wall */ THRIFT_UNUSED_VAR (object); object->column = g_object_new (TYPE_COLUMN, NULL); object->__isset_column = FALSE;
But this instance reference is lost and replaced by a new TYPE_COLUMN instantiation reference when the column member is read by column_or_super_column_read() within the same execution context of the top level cassandra_client_recv_get_slice() call:
switch (fid) { case 1: if (ftype == T_STRUCT) { this_object->column = g_object_new (TYPE_COLUMN, NULL); if ((ret = thrift_struct_read (THRIFT_STRUCT (this_object->column), protocol, error)) < 0)
The above snippets/logic/leak described above for cassandra_client_get_slice() also apply for cassandra_client_get().