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

Patch: Simon South
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::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 @@
                                                           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);