Преглед изворни кода

frame: catch panics from parsing

Chris Bannister пре 10 година
родитељ
комит
f42867acbd
1 измењених фајлова са 12 додато и 6 уклоњено
  1. 12 6
      frame.go

+ 12 - 6
frame.go

@@ -360,7 +360,7 @@ func (f *framer) readFrame(head *frameHeader) error {
 	return nil
 }
 
-func (f *framer) parseFrame() (frame, error) {
+func (f *framer) parseFrame() (frame frame, err error) {
 	if f.header.version.request() {
 		return nil, NewErrProtocol("got a request frame from server: %v", f.header.version)
 	}
@@ -369,10 +369,16 @@ func (f *framer) parseFrame() (frame, error) {
 		f.readTrace()
 	}
 
-	var (
-		frame frame
-		err   error
-	)
+	defer func() {
+		if r := recover(); r != nil {
+			if perr, ok := r.(error); ok {
+				err = perr
+				return
+			}
+
+			panic(r)
+		}
+	}()
 
 	// asumes that the frame body has been read into rbuf
 	switch f.header.op {
@@ -394,7 +400,7 @@ func (f *framer) parseFrame() (frame, error) {
 		return nil, NewErrProtocol("unknown op in frame header: %s", f.header.op)
 	}
 
-	return frame, err
+	return
 }
 
 func (f *framer) parseErrorFrame() frame {