From: Roger Meier Date: Wed, 26 Mar 2014 22:32:34 +0000 (+0100) Subject: THRIFT-2414 c_glib fix several bug X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=bf0b6291f8bc7192847a2da458fdd40ee7256066;p=common%2Fthrift.git THRIFT-2414 c_glib fix several bug Patch: Jaesang Kim --- diff --git a/.gitignore b/.gitignore index eabb1987..90d5308d 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ node_modules .pydevproject .sonar .DS_Store +.svn /contrib/.vagrant/ /autoscan.log diff --git a/compiler/cpp/src/generate/t_c_glib_generator.cc b/compiler/cpp/src/generate/t_c_glib_generator.cc index 373e6a8e..639f4792 100644 --- a/compiler/cpp/src/generate/t_c_glib_generator.cc +++ b/compiler/cpp/src/generate/t_c_glib_generator.cc @@ -490,10 +490,7 @@ bool t_c_glib_generator::is_complex_type(t_type *ttype) { return ttype->is_container() || ttype->is_struct() - || ttype->is_xception() - || (ttype->is_base_type() - && (((t_base_type *) ttype)->get_base() - == t_base_type::TYPE_STRING)); + || ttype->is_xception(); } @@ -1436,7 +1433,7 @@ void t_c_glib_generator::generate_service_client(t_service *tservice) { f_service_ << endl << indent() << "gint32 rseqid;" << endl << - indent() << "gchar * fname;" << endl << + indent() << "gchar * fname = NULL;" << endl << indent() << "ThriftMessageType mtype;" << endl << indent() << "ThriftProtocol * protocol = " << this->nspace_uc << service_name_uc << @@ -1822,7 +1819,7 @@ void t_c_glib_generator::generate_object(t_struct *tstruct) { f_types_impl_ << indent() << "}" << endl; } else if (t->is_list()) { t_type *etype = ((t_list *) t)->get_elem_type(); - string destructor_function = "g_ptr_array_free"; + string destructor_function = "g_ptr_array_unref"; if (etype->is_base_type()) { t_base_type::t_base tbase = ((t_base_type *) etype)->get_base(); @@ -1835,7 +1832,7 @@ void t_c_glib_generator::generate_object(t_struct *tstruct) { case t_base_type::TYPE_I32: case t_base_type::TYPE_I64: case t_base_type::TYPE_DOUBLE: - destructor_function = "g_array_free"; + destructor_function = "g_array_unref"; break; case t_base_type::TYPE_STRING: break; @@ -1849,7 +1846,7 @@ void t_c_glib_generator::generate_object(t_struct *tstruct) { indent_up(); f_types_impl_ << indent() << destructor_function << " (tobject->" << name << - ", TRUE);" << endl; + ");" << endl; f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl; indent_down(); f_types_impl_ << indent() << "}" << endl; @@ -1873,7 +1870,7 @@ void t_c_glib_generator::generate_object(t_struct *tstruct) { f_types_impl_ << indent() << "{" << endl; indent_up(); f_types_impl_ << - indent() << "g_free (tobject->" << name << ");" << endl; + indent() << generate_free_func_from_type(t) << "(tobject->" << name << ");" << endl; f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl; indent_down(); f_types_impl_ << indent() << "}" << endl; @@ -2859,6 +2856,9 @@ string t_c_glib_generator::generate_free_func_from_type (t_type * ttype) { case t_base_type::TYPE_DOUBLE: return "NULL"; case t_base_type::TYPE_STRING: + if (((t_base_type *) ttype)->is_binary()) { + return "thrift_string_free"; + } return "g_free"; default: throw "compiler error: no hash table info for type"; diff --git a/compiler/cpp/src/thrifty.yy b/compiler/cpp/src/thrifty.yy old mode 100755 new mode 100644 diff --git a/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c b/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c index da59628f..32a8000d 100644 --- a/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c +++ b/lib/c_glib/src/thrift/c_glib/protocol/thrift_binary_protocol.c @@ -806,6 +806,7 @@ thrift_binary_protocol_read_binary (ThriftProtocol *protocol, } xfer += ret; } else { + *len = (guint32) read_len; *buf = NULL; } diff --git a/lib/c_glib/src/thrift/c_glib/thrift.c b/lib/c_glib/src/thrift/c_glib/thrift.c index 0051df09..079cb510 100644 --- a/lib/c_glib/src/thrift/c_glib/thrift.c +++ b/lib/c_glib/src/thrift/c_glib/thrift.c @@ -30,3 +30,9 @@ thrift_hash_table_get_keys (gpointer key, gpointer value, gpointer user_data) *list = g_list_append (*list, key); } +void +thrift_string_free (gpointer str) +{ + GByteArray* ptr = str; + g_byte_array_unref(ptr); +} diff --git a/lib/c_glib/src/thrift/c_glib/thrift.h b/lib/c_glib/src/thrift/c_glib/thrift.h index 0636a2f2..236b46f6 100644 --- a/lib/c_glib/src/thrift/c_glib/thrift.h +++ b/lib/c_glib/src/thrift/c_glib/thrift.h @@ -33,5 +33,6 @@ void thrift_hash_table_get_keys (gpointer key, gpointer value, gpointer user_data); +void thrift_string_free (gpointer str); #endif // #ifndef _THRIFT_THRIFT_H diff --git a/lib/c_glib/src/thrift/c_glib/thrift_application_exception.c b/lib/c_glib/src/thrift/c_glib/thrift_application_exception.c index 2b8b3955..64bd87ae 100644 --- a/lib/c_glib/src/thrift/c_glib/thrift_application_exception.c +++ b/lib/c_glib/src/thrift/c_glib/thrift_application_exception.c @@ -170,10 +170,24 @@ thrift_application_exception_init (ThriftApplicationException *object) object->__isset_message = FALSE; } +void +thrift_application_exception_finalize (GObject *object) +{ + ThriftApplicationException *tae = THRIFT_APPLICATION_EXCEPTION (object); + + if (tae->__isset_message) { + g_free(tae->message); + } +} + void thrift_application_exception_class_init (ThriftApplicationExceptionClass *class) { + GObjectClass *gobject_class = G_OBJECT_CLASS(class); ThriftStructClass *cls = THRIFT_STRUCT_CLASS(class); + cls->read = thrift_application_exception_read; cls->write = thrift_application_exception_write; + + gobject_class->finalize = thrift_application_exception_finalize; } diff --git a/lib/c_glib/src/thrift/c_glib/transport/thrift_buffered_transport.c b/lib/c_glib/src/thrift/c_glib/transport/thrift_buffered_transport.c index a32e5adf..d6b67edf 100644 --- a/lib/c_glib/src/thrift/c_glib/transport/thrift_buffered_transport.c +++ b/lib/c_glib/src/thrift/c_glib/transport/thrift_buffered_transport.c @@ -69,6 +69,7 @@ thrift_buffered_transport_read_slow (ThriftTransport *transport, gpointer buf, guint32 len, GError **error) { ThriftBufferedTransport *t = THRIFT_BUFFERED_TRANSPORT (transport); + gint ret = 0; guint32 want = len; guint32 got = 0; guchar tmpdata[len]; @@ -90,19 +91,25 @@ thrift_buffered_transport_read_slow (ThriftTransport *transport, gpointer buf, // enough to satisfy the read. if (t->r_buf_size < want) { - got += THRIFT_TRANSPORT_GET_CLASS (t->transport)->read (t->transport, + if ((ret = THRIFT_TRANSPORT_GET_CLASS (t->transport)->read (t->transport, tmpdata, want, - error); + error)) < 0) { + return ret; + } + got += ret; // copy the data starting from where we left off memcpy (buf + have, tmpdata, got); return got + have; } else { - got += THRIFT_TRANSPORT_GET_CLASS (t->transport)->read (t->transport, + if ((ret = THRIFT_TRANSPORT_GET_CLASS (t->transport)->read (t->transport, tmpdata, want, - error); + error)) < 0) { + return ret; + } + got += ret; t->r_buf = g_byte_array_append (t->r_buf, tmpdata, got); // hand over what we have up to what the caller wants diff --git a/lib/c_glib/src/thrift/c_glib/transport/thrift_socket.c b/lib/c_glib/src/thrift/c_glib/transport/thrift_socket.c index 694a84ca..a371ace1 100644 --- a/lib/c_glib/src/thrift/c_glib/transport/thrift_socket.c +++ b/lib/c_glib/src/thrift/c_glib/transport/thrift_socket.c @@ -54,20 +54,21 @@ thrift_socket_is_open (ThriftTransport *transport) gboolean thrift_socket_open (ThriftTransport *transport, GError **error) { - struct hostent *hp = NULL; + struct hostent he, *hp = NULL; struct sockaddr_in pin; + int err; + char buf[1024]; ThriftSocket *tsocket = THRIFT_SOCKET (transport); g_return_val_if_fail (tsocket->sd == 0, FALSE); /* lookup the destination host */ - if ((hp = gethostbyname (tsocket->hostname)) == NULL) - { + if (gethostbyname_r(tsocket->hostname, &he, buf, 1024, &hp, &err) != 0 || hp == NULL) { /* host lookup failed, bail out with an error */ g_set_error (error, THRIFT_TRANSPORT_ERROR, THRIFT_TRANSPORT_ERROR_HOST, "host lookup failed for %s:%d - %s", tsocket->hostname, tsocket->port, - hstrerror (h_errno)); + hstrerror (err)); return FALSE; } @@ -130,7 +131,7 @@ thrift_socket_read (ThriftTransport *transport, gpointer buf, while (got < len) { ret = recv (socket->sd, buf+got, len-got, 0); - if (ret < 0) + if (ret <= 0) { g_set_error (error, THRIFT_TRANSPORT_ERROR, THRIFT_TRANSPORT_ERROR_RECEIVE,