From 2006d99d251bc2c4a1e06e39bdee789c459327fe Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Mon, 29 Jan 2007 17:58:54 +0000 Subject: [PATCH] Thrift gen'd code now checks for field ID AND type matches Summary: Will call skip() even if FID matches when there is an invalid field type identifier Reviewed By: corson git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664956 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_cpp_generator.cc | 11 ++++++++++- compiler/cpp/src/generate/t_java_generator.cc | 12 ++++++++++-- compiler/cpp/src/generate/t_php_generator.cc | 15 +++++++++++++-- compiler/cpp/src/generate/t_py_generator.cc | 6 ++++++ compiler/cpp/src/generate/t_rb_generator.cc | 6 ++++++ 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index eb88a176..05b43313 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -512,13 +512,22 @@ void t_cpp_generator::generate_struct_reader(ofstream& out, indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; indent_up(); + indent(out) << + "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent_up(); + if (pointers && !(*f_iter)->get_type()->is_xception()) { generate_deserialize_field(out, *f_iter, "(*(this->", "))"); } else { generate_deserialize_field(out, *f_iter, "this->"); } out << - indent() << "this->__isset." << (*f_iter)->get_name() << " = true;" << endl << + indent() << "this->__isset." << (*f_iter)->get_name() << " = true;" << endl; + indent_down(); + out << + indent() << "} else {" << endl << + indent() << " xfer += iprot->skip(ftype);" << endl << + indent() << "}" << endl << indent() << "break;" << endl; indent_down(); } diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index d8c14592..ffe8b2af 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -427,11 +427,19 @@ void t_java_generator::generate_java_struct_reader(ofstream& out, indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; indent_up(); + indent(out) << + "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent_up(); + generate_deserialize_field(out, *f_iter, "this."); out << indent() << "this.__isset." << (*f_iter)->get_name() << " = true;" << endl; - indent(out) << - "break;" << endl; + indent_down(); + out << + indent() << "} else { " << endl << + indent() << " TProtocolUtil.skip(iprot, field.type);" << endl << + indent() << "}" << endl << + indent() << "break;" << endl; indent_down(); } diff --git a/compiler/cpp/src/generate/t_php_generator.cc b/compiler/cpp/src/generate/t_php_generator.cc index cb11d489..5418733a 100644 --- a/compiler/cpp/src/generate/t_php_generator.cc +++ b/compiler/cpp/src/generate/t_php_generator.cc @@ -376,9 +376,20 @@ void t_php_generator::generate_php_struct_reader(ofstream& out, indent(out) << "case " << (*f_iter)->get_key() << ":" << endl; indent_up(); + indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl; + indent_up(); generate_deserialize_field(out, *f_iter, "this->"); - indent(out) << - "break;" << endl; + indent_down(); + out << + indent() << "} else {" << endl; + if (binary_inline_) { + indent(out) << " $xfer += TProtocol::skipBinary($input, $ftype);" << endl; + } else { + indent(out) << " $xfer += $input->skip($ftype);" << endl; + } + out << + indent() << "}" << endl << + indent() << "break;" << endl; indent_down(); } diff --git a/compiler/cpp/src/generate/t_py_generator.cc b/compiler/cpp/src/generate/t_py_generator.cc index a8e07267..daf56bf5 100644 --- a/compiler/cpp/src/generate/t_py_generator.cc +++ b/compiler/cpp/src/generate/t_py_generator.cc @@ -376,8 +376,14 @@ void t_py_generator::generate_py_struct_reader(ofstream& out, } out << "fid == " << (*f_iter)->get_key() << ":" << endl; indent_up(); + indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << ":" << endl; + indent_up(); generate_deserialize_field(out, *f_iter, "self."); indent_down(); + out << + indent() << "else:" << endl << + indent() << " iprot.skip(ftype)" << endl; + indent_down(); } // In the default case we skip the field diff --git a/compiler/cpp/src/generate/t_rb_generator.cc b/compiler/cpp/src/generate/t_rb_generator.cc index b9f12ece..e33a5ec1 100644 --- a/compiler/cpp/src/generate/t_rb_generator.cc +++ b/compiler/cpp/src/generate/t_rb_generator.cc @@ -399,8 +399,14 @@ void t_rb_generator::generate_rb_struct_reader(ofstream& out, } out << "(fid == " << (*f_iter)->get_key() << ")" << endl; indent_up(); + indent(out) << "if (ftype === " << type_to_enum((*f_iter)->get_type()) << ")" << endl; + indent_up(); generate_deserialize_field(out, *f_iter, "@"); indent_down(); + out << + indent() << "else" << endl << + indent() << " iprot.skip(ftype)" << endl << + indent() << "end" << endl; } // In the default case we skip the field -- 2.17.1