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
diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc
index eb88a17..05b4331 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/generate/t_cpp_generator.cc
@@ -512,13 +512,22 @@
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 d8c1459..ffe8b2a 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -427,11 +427,19 @@
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 cb11d48..5418733 100644
--- a/compiler/cpp/src/generate/t_php_generator.cc
+++ b/compiler/cpp/src/generate/t_php_generator.cc
@@ -376,9 +376,20 @@
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 a8e0726..daf56bf 100644
--- a/compiler/cpp/src/generate/t_py_generator.cc
+++ b/compiler/cpp/src/generate/t_py_generator.cc
@@ -376,8 +376,14 @@
}
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 b9f12ec..e33a5ec 100644
--- a/compiler/cpp/src/generate/t_rb_generator.cc
+++ b/compiler/cpp/src/generate/t_rb_generator.cc
@@ -399,8 +399,14 @@
}
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