You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2022/04/20 21:29:06 UTC

[thrift] branch master updated: THRIFT-5569: add negative size checks in Go generator when reading maps, sets and lists

This is an automated email from the ASF dual-hosted git repository.

jensg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 8987820e8 THRIFT-5569: add negative size checks in Go generator when reading maps, sets and lists
8987820e8 is described below

commit 8987820e84ac26392293ab40480cf8f2971fb314
Author: Andreas Krennmair <an...@fraugster.com>
AuthorDate: Wed Apr 20 13:20:12 2022 +0200

    THRIFT-5569: add negative size checks in Go generator when reading maps, sets and lists
    
    Client: go
---
 compiler/cpp/src/thrift/generate/t_go_generator.cc | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc
index 3b885f103..020297b9b 100644
--- a/compiler/cpp/src/thrift/generate/t_go_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc
@@ -3369,6 +3369,9 @@ void t_go_generator::generate_deserialize_container(ostream& out,
   // Declare variables, read header
   if (ttype->is_map()) {
     out << indent() << "_, _, size, err := iprot.ReadMapBegin(ctx)" << endl;
+    out << indent() << "if size < 0 {" << endl;
+    out << indent() << "  return errors.New(\"map size is negative\")" << endl;
+    out << indent() << "}" << endl;
     out << indent() << "if err != nil {" << endl;
     out << indent() << "  return thrift.PrependError(\"error reading map begin: \", err)" << endl;
     out << indent() << "}" << endl;
@@ -3376,6 +3379,9 @@ void t_go_generator::generate_deserialize_container(ostream& out,
     out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << endl;
   } else if (ttype->is_set()) {
     out << indent() << "_, size, err := iprot.ReadSetBegin(ctx)" << endl;
+    out << indent() << "if size < 0 {" << endl;
+    out << indent() << "  return errors.New(\"set size is negative\")" << endl;
+    out << indent() << "}" << endl;
     out << indent() << "if err != nil {" << endl;
     out << indent() << "  return thrift.PrependError(\"error reading set begin: \", err)" << endl;
     out << indent() << "}" << endl;
@@ -3383,6 +3389,9 @@ void t_go_generator::generate_deserialize_container(ostream& out,
     out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << endl;
   } else if (ttype->is_list()) {
     out << indent() << "_, size, err := iprot.ReadListBegin(ctx)" << endl;
+    out << indent() << "if size < 0 {" << endl;
+    out << indent() << "  return errors.New(\"list size is negative\")" << endl;
+    out << indent() << "}" << endl;
     out << indent() << "if err != nil {" << endl;
     out << indent() << "  return thrift.PrependError(\"error reading list begin: \", err)" << endl;
     out << indent() << "}" << endl;