@@ -198,8 +198,14 @@ static vector<bytes> unpack_context_free_data(const bytes& data) {
198198 return fc::raw::unpack< vector<bytes> >(data);
199199}
200200
201- static transaction unpack_transaction (const bytes& data) {
202- return fc::raw::unpack<transaction>(data);
201+ static transaction unpack_transaction (const bytes& data, bool & extra_data) {
202+ try {
203+ transaction tmp;
204+ fc::datastream<const char *> ds ( data.data (), size_t (data.size ()) );
205+ fc::raw::unpack (ds,tmp);
206+ extra_data = ds.remaining ();
207+ return tmp;
208+ } FC_RETHROW_EXCEPTIONS ( warn, " error unpacking transaction" )
203209}
204210
205211static bytes zlib_decompress (const bytes& data) {
@@ -228,9 +234,9 @@ static vector<bytes> zlib_decompress_context_free_data(const bytes& data) {
228234 return unpack_context_free_data (out);
229235}
230236
231- static transaction zlib_decompress_transaction (const bytes& data) {
237+ static transaction zlib_decompress_transaction (const bytes& data, bool & extra_data ) {
232238 bytes out = zlib_decompress (data);
233- return unpack_transaction (out);
239+ return unpack_transaction (out, extra_data );
234240}
235241
236242static bytes pack_transaction (const transaction& t) {
@@ -305,6 +311,29 @@ packed_transaction::packed_transaction( transaction&& t, vector<signature_type>&
305311 }
306312}
307313
314+ void packed_transaction::normalize () {
315+ validate_no_extra_data ();
316+
317+ switch ( compression ) {
318+ case compression_type::none:
319+ return ;
320+ case compression_type::zlib:
321+ break ;
322+ default :
323+ EOS_THROW ( unknown_transaction_compression, " Unknown transaction compression algorithm" );
324+ }
325+ packed_trx = zlib_decompress (packed_trx);
326+ compression = compression_type::none;
327+ }
328+
329+ void packed_transaction::validate_no_extra_data () const {
330+ EOS_ASSERT (!extra_data, tx_extra_data_error, " Extra-data not allowed in packed_transaction" );
331+ }
332+
333+ void packed_transaction::validate_no_compression () const {
334+ EOS_ASSERT (get_compression () == compression_type::none, tx_compression_error, " Compressed packed_transaction not allowed" );
335+ }
336+
308337void packed_transaction::reflector_init ()
309338{
310339 // called after construction, but always on the same thread and before packed_transaction passed to any other threads
@@ -320,10 +349,10 @@ void packed_transaction::local_unpack_transaction(vector<bytes>&& context_free_d
320349 try {
321350 switch ( compression ) {
322351 case compression_type::none:
323- unpacked_trx = signed_transaction ( unpack_transaction ( packed_trx ), signatures, std::move (context_free_data) );
352+ unpacked_trx = signed_transaction ( unpack_transaction ( packed_trx, extra_data ), signatures, std::move (context_free_data) );
324353 break ;
325354 case compression_type::zlib:
326- unpacked_trx = signed_transaction ( zlib_decompress_transaction ( packed_trx ), signatures, std::move (context_free_data) );
355+ unpacked_trx = signed_transaction ( zlib_decompress_transaction ( packed_trx, extra_data ), signatures, std::move (context_free_data) );
327356 break ;
328357 default :
329358 EOS_THROW ( unknown_transaction_compression, " Unknown transaction compression algorithm" );
0 commit comments