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