c_glib_generator.cc generates leaking code for cassandra_client_get_slice() and
cassandra_client_get()
------------------------------------------------------------------------------------------------------
Key: THRIFT-1389
URL: https://issues.apache.org/jira/browse/THRIFT-1389
Project: Thrift
Issue Type: Bug
Components: C glib - Compiler, C glib - Library
Affects Versions: 0.6.1
Environment: Used with Cassandra 0.8.4 on Linux 2.6.32 with x86_64
Reporter: Jerry Gally
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,:
<... snip>
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)
<\snip ...>
When the object of TYPE_COLUMN_OR_SUPER_COLUMN is instantiated, it in-turn
instantiates a child of TYPE_COLUMN:
<... snip>
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;
</snip ...>
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:
<... snip>
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)
</snip ...>
The above snippits/logic/leak described above for cassandra_client_get_slice()
also apply for cassandra_client_get().
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira