THRIFT-5237 Implement MAX_MESSAGE_SIZE and consolidate limits into a TConfiguration class
Client: cpp
Patch: Zezeng Wang

This closes #2185
diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc
index 2964f25..755f243 100644
--- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc
+++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc
@@ -21,6 +21,7 @@
 #define _THRIFT_PROTOCOL_TBINARYPROTOCOL_TCC_ 1
 
 #include <thrift/protocol/TBinaryProtocol.h>
+#include <thrift/transport/TTransportException.h>
 
 #include <limits>
 
@@ -285,6 +286,10 @@
     throw TProtocolException(TProtocolException::SIZE_LIMIT);
   }
   size = (uint32_t)sizei;
+  
+  TMap map(keyType, valType, size);
+  checkReadBytesAvailable(map);
+
   return result;
 }
 
@@ -307,6 +312,10 @@
     throw TProtocolException(TProtocolException::SIZE_LIMIT);
   }
   size = (uint32_t)sizei;
+
+  TList list(elemType, size);
+  checkReadBytesAvailable(list);
+
   return result;
 }
 
@@ -329,6 +338,10 @@
     throw TProtocolException(TProtocolException::SIZE_LIMIT);
   }
   size = (uint32_t)sizei;
+
+  TSet set(elemType, size);
+  checkReadBytesAvailable(set);
+
   return result;
 }
 
@@ -447,6 +460,30 @@
   this->trans_->readAll(reinterpret_cast<uint8_t*>(&str[0]), size);
   return (uint32_t)size;
 }
+
+// Return the minimum number of bytes a type will consume on the wire
+template <class Transport_, class ByteOrder_>
+int TBinaryProtocolT<Transport_, ByteOrder_>::getMinSerializedSize(TType type)
+{
+  switch (type)
+  {
+      case T_STOP: return 0;
+      case T_VOID: return 0;
+      case T_BOOL: return sizeof(int8_t);
+      case T_BYTE: return sizeof(int8_t);
+      case T_DOUBLE: return sizeof(double);
+      case T_I16: return sizeof(short);
+      case T_I32: return sizeof(int);
+      case T_I64: return sizeof(long);
+      case T_STRING: return sizeof(int);  // string length
+      case T_STRUCT: return 0;  // empty struct
+      case T_MAP: return sizeof(int);  // element count
+      case T_SET: return sizeof(int);  // element count
+      case T_LIST: return sizeof(int);  // element count
+      default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code");
+  }
+}
+
 }
 }
 } // apache::thrift::protocol