[英]Golang panic in tls conn Read - only on linux?
我正在使用golang crypto/tls
处理自定义的面向行的消息协议。
这种方法在Windows上效果很好:
var fullBuffer string
for {
// If we're not connected, attempt reconnect
if this.conn == nil {
if this.IsSecure() {
this.conn, err = tls.Dial("tcp", this.GetHostOnly(), nil)
} else {
this.conn, err = net.Dial("tcp", this.GetHostOnly())
}
if err == nil {
// log and continue
}
}
// Read from socket into our local buffer (blocking)
if this.conn != nil {
readBuff := make([]byte, 4096)
nbytes, err = this.conn.Read(readBuff)
if nbytes > 0 {
fullBuffer += string(readBuff[0:nbytes])
}
}
非常简单-在win64上运行良好。
但是,当我尝试在Linux上运行它(debian 8-i386和amd64-都是从Windows进行golang 1.5本机和1.6交叉编译)时,我会遇到以下恐慌:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x4ec8b4]
goroutine 8 [running]:
panic(0x8237780, 0x18522030)
C:/Go/src/runtime/panic.go:464 +0x326
crypto/tls.(*Conn).Handshake(0x0, 0x0, 0x0)
C:/Go/src/crypto/tls/conn.go:1023 +0x198
crypto/tls.(*Conn).Read(0x0, 0x18597000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
C:/Go/src/crypto/tls/conn.go:922 +0x5e
mylib.(*MyConnection).worker(0x18512480)
C:/gopath/src/mylib/mylib.go:342 +0x200
Read调用失败,因为它以某种方式将nil传递给TLS握手。
这是怎么了
而且,为什么这个问题只限于linux?
好的,Linux构建产生错误x509: certificate signed by unknown authority
。
但
证书有效
crypto/x509/root_unix.go
在/etc/ssl/certs
查找,这是世界可读的 openssl s_client
挂在-showcerts -verify
,指出我的OS网络配置存在一些问题 由于某种原因,无论错误如何,都将进入下面的if
块
net.Conn
而不是指针,因此它不是nil
-able。 称此为已解决,对不起您的声音。 希望这个调试故事对以后的人有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.