Repository: thrift
Updated Branches:
  refs/heads/master 7fa9848b8 -> 546209c96


THRIFT-2683 c_glib: Seg fault when deserializing a map with typedef'd keys

Patch: Simon South


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/546209c9
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/546209c9
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/546209c9

Branch: refs/heads/master
Commit: 546209c9615632fa76edf1cc9604b5ad8837a97c
Parents: 7fa9848
Author: Roger Meier <[email protected]>
Authored: Mon Sep 1 20:23:26 2014 +0200
Committer: Roger Meier <[email protected]>
Committed: Mon Sep 1 20:23:26 2014 +0200

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_c_glib_generator.cc | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/546209c9/compiler/cpp/src/generate/t_c_glib_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_c_glib_generator.cc 
b/compiler/cpp/src/generate/t_c_glib_generator.cc
index feef575..61a5461 100644
--- a/compiler/cpp/src/generate/t_c_glib_generator.cc
+++ b/compiler/cpp/src/generate/t_c_glib_generator.cc
@@ -3415,6 +3415,11 @@ void t_c_glib_generator::generate_deserialize_container 
(ofstream &out, t_type *
 
 void t_c_glib_generator::declare_local_variable(ofstream &out, t_type *ttype, 
string &name) {
   string tname = type_name (ttype);
+
+  /* If the given type is a typedef, find its underlying type so we
+     can correctly determine how to generate a pointer to it */
+  ttype = get_true_type(ttype);
+
   string ptr = ttype->is_string() || !ttype->is_base_type() ? "" : "*";
 
   if (ttype->is_map()) {
@@ -3436,14 +3441,21 @@ void 
t_c_glib_generator::generate_deserialize_map_element(ofstream &out,
                                                           int error_ret) {
   t_type *tkey = tmap->get_key_type();
   t_type *tval = tmap->get_val_type();
-  string tkey_ptr = tkey->is_string() || !tkey->is_base_type() ? "" : "*";
-  string tval_ptr = tval->is_string() || !tval->is_base_type() ? "" : "*";
   string keyname = tmp("key");
   string valname = tmp("val");
 
   declare_local_variable(out, tkey, keyname);
   declare_local_variable(out, tval, valname);
 
+  /* If either the key or value type is a typedef, find its underlying
+     type so we can correctly determine how to generate a pointer to
+     it */
+  tkey = get_true_type(tkey);
+  tval = get_true_type(tval);
+
+  string tkey_ptr = tkey->is_string() || !tkey->is_base_type() ? "" : "*";
+  string tval_ptr = tval->is_string() || !tval->is_base_type() ? "" : "*";
+
   // deserialize the fields of the map element
   t_field fkey (tkey, tkey_ptr + keyname);
   generate_deserialize_field (out, &fkey, "", "", error_ret);

Reply via email to