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);
