Repository: thrift
Updated Branches:
  refs/heads/master 401803698 -> 3ea26be2a


THRIFT-3236 MaxSkipDepth never checked
Client: Go
Patch: Jens Geyer


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/3ea26be2
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/3ea26be2
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/3ea26be2

Branch: refs/heads/master
Commit: 3ea26be2ae08c2c7992137e5142cec146627e119
Parents: 4018036
Author: Jens Geyer <[email protected]>
Authored: Fri Jul 10 00:23:39 2015 +0200
Committer: Jens Geyer <[email protected]>
Committed: Fri Jul 10 02:00:36 2015 +0200

----------------------------------------------------------------------
 lib/go/thrift/protocol.go | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/3ea26be2/lib/go/thrift/protocol.go
----------------------------------------------------------------------
diff --git a/lib/go/thrift/protocol.go b/lib/go/thrift/protocol.go
index 87ceaad..6fb0177 100644
--- a/lib/go/thrift/protocol.go
+++ b/lib/go/thrift/protocol.go
@@ -19,6 +19,10 @@
 
 package thrift
 
+import (
+       "errors"
+)
+
 const (
        VERSION_MASK = 0xffff0000
        VERSION_1    = 0x80010000
@@ -75,15 +79,20 @@ type TProtocol interface {
 }
 
 // The maximum recursive depth the skip() function will traverse
-var MaxSkipDepth = 1<<31 - 1
+const DEFAULT_RECURSION_DEPTH = 64
 
 // Skips over the next data element from the provided input TProtocol object.
 func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) {
-       return Skip(prot, typeId, MaxSkipDepth)
+       return Skip(prot, typeId, DEFAULT_RECURSION_DEPTH)
 }
 
 // Skips over the next data element from the provided input TProtocol object.
 func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) {
+       
+    if maxDepth <= 0 {
+               return NewTProtocolExceptionWithType( DEPTH_LIMIT, 
errors.New("Depth limit exceeded"))
+       }
+
        switch fieldType {
        case STOP:
                return
@@ -117,7 +126,10 @@ func Skip(self TProtocol, fieldType TType, maxDepth int) 
(err error) {
                        if typeId == STOP {
                                break
                        }
-                       Skip(self, typeId, maxDepth-1)
+                       err := Skip(self, typeId, maxDepth-1)
+                       if err != nil {
+                               return err
+                       }
                        self.ReadFieldEnd()
                }
                return self.ReadStructEnd()
@@ -127,7 +139,10 @@ func Skip(self TProtocol, fieldType TType, maxDepth int) 
(err error) {
                        return err
                }
                for i := 0; i < size; i++ {
-                       Skip(self, keyType, maxDepth-1)
+                       err := Skip(self, keyType, maxDepth-1)
+                       if err != nil {
+                               return err
+                       }
                        self.Skip(valueType)
                }
                return self.ReadMapEnd()
@@ -137,7 +152,10 @@ func Skip(self TProtocol, fieldType TType, maxDepth int) 
(err error) {
                        return err
                }
                for i := 0; i < size; i++ {
-                       Skip(self, elemType, maxDepth-1)
+                       err := Skip(self, elemType, maxDepth-1)
+                       if err != nil {
+                               return err
+                       }
                }
                return self.ReadSetEnd()
        case LIST:
@@ -146,7 +164,10 @@ func Skip(self TProtocol, fieldType TType, maxDepth int) 
(err error) {
                        return err
                }
                for i := 0; i < size; i++ {
-                       Skip(self, elemType, maxDepth-1)
+                       err := Skip(self, elemType, maxDepth-1)
+                       if err != nil {
+                               return err
+                       }
                }
                return self.ReadListEnd()
        }

Reply via email to