From 636acc6063b0e83aa5d2f2f83f89c0422ad6b182 Mon Sep 17 00:00:00 2001
From: Andrew Harding <andrew@spacemonkey.com>
Date: Mon, 7 Apr 2014 15:12:55 -0600
Subject: [PATCH] space monkey internal commit export

[katamari commit: 87d5f6746f1615ec53f6a4e4d484ad429665bfd6]
---
 bio.go | 35 +++++++++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 4 deletions(-)

diff --git a/bio.go b/bio.go
index 136376c..dd39789 100644
--- a/bio.go
+++ b/bio.go
@@ -106,7 +106,13 @@ func loadWritePtr(b *C.BIO) *writeBio {
 }
 
 //export writeBioWrite
-func writeBioWrite(b *C.BIO, data *C.char, size C.int) C.int {
+func writeBioWrite(b *C.BIO, data *C.char, size C.int) (rc C.int) {
+	defer func() {
+		if err := recover(); err != nil {
+			logger.Critf("openssl: writeBioWrite panic'd: %v", err)
+			rc = -1
+		}
+	}()
 	ptr := loadWritePtr(b)
 	if ptr == nil || data == nil || size < 0 {
 		return -1
@@ -119,7 +125,14 @@ func writeBioWrite(b *C.BIO, data *C.char, size C.int) C.int {
 }
 
 //export writeBioCtrl
-func writeBioCtrl(b *C.BIO, cmd C.int, arg1 C.long, arg2 unsafe.Pointer) C.long {
+func writeBioCtrl(b *C.BIO, cmd C.int, arg1 C.long, arg2 unsafe.Pointer) (
+	rc C.long) {
+	defer func() {
+		if err := recover(); err != nil {
+			logger.Critf("openssl: writeBioCtrl panic'd: %v", err)
+			rc = -1
+		}
+	}()
 	switch cmd {
 	case C.BIO_CTRL_WPENDING:
 		return writeBioPending(b)
@@ -186,7 +199,13 @@ func loadReadPtr(b *C.BIO) *readBio {
 }
 
 //export readBioRead
-func readBioRead(b *C.BIO, data *C.char, size C.int) C.int {
+func readBioRead(b *C.BIO, data *C.char, size C.int) (rc C.int) {
+	defer func() {
+		if err := recover(); err != nil {
+			logger.Critf("openssl: readBioRead panic'd: %v", err)
+			rc = -1
+		}
+	}()
 	ptr := loadReadPtr(b)
 	if ptr == nil || size < 0 {
 		return -1
@@ -210,7 +229,15 @@ func readBioRead(b *C.BIO, data *C.char, size C.int) C.int {
 }
 
 //export readBioCtrl
-func readBioCtrl(b *C.BIO, cmd C.int, arg1 C.long, arg2 unsafe.Pointer) C.long {
+func readBioCtrl(b *C.BIO, cmd C.int, arg1 C.long, arg2 unsafe.Pointer) (
+	rc C.long) {
+
+	defer func() {
+		if err := recover(); err != nil {
+			logger.Critf("openssl: readBioCtrl panic'd: %v", err)
+			rc = -1
+		}
+	}()
 	switch cmd {
 	case C.BIO_CTRL_PENDING:
 		return readBioPending(b)