Skip to content

Commit

Permalink
fix nil pointer dereference caused by nil 'cs' (#2440)
Browse files Browse the repository at this point in the history
* fix: nil pointer dereference caused by nil 'cs'
修复刷新 token 时若当前签名服务不可用而主签名服务可用会导致panic的问题。
btw, energy 出现decode error时打印出导致错误的数据内容

* optimize: 只配置了一个签名服务时不进行检查和切换操作

* fix(qsign): 刷新token提示未初始化

修复在qsign崩溃重启前请求了签名服务器导致当前签名服务器被标记为不可用(`ss.set(nil)`),
从而不会再执行sign请求(除非有其他请求签名服务器的操作)
这可能导致下一次刷新token提示uin is not registered或者提示未初始化

* update qsign.go
  • Loading branch information
1umine committed Oct 1, 2023
1 parent f16d72f commit 1c34643
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions cmd/gocq/qsign.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ import (
type currentSignServer atomic.Pointer[config.SignServer]

func (c *currentSignServer) get() *config.SignServer {
if len(base.SignServers) == 1 {
// 只配置了一个签名服务时不检查以及切换, 在get阶段返回,防止返回nil导致其他bug(可能)
return &base.SignServers[0]
}
return (*atomic.Pointer[config.SignServer])(c).Load()
}

Expand Down Expand Up @@ -168,7 +172,7 @@ func energy(uin uint64, id string, _ string, salt []byte) ([]byte, error) {
}
data, err := hex.DecodeString(gjson.GetBytes(response, "data").String())
if err != nil {
log.Warnf("获取T544 sign时出现错误: %v", err)
log.Warnf("获取T544 sign时出现错误: %v (data: %v)", err, gjson.GetBytes(response, "data").String())
return nil, err
}
if len(data) == 0 {
Expand Down Expand Up @@ -210,7 +214,7 @@ func signCallback(uin string, results []gjson.Result, t string) {
body, _ := hex.DecodeString(result.Get("body").String())
ret, err := cli.SendSsoPacket(cmd, body)
if err != nil || len(ret) == 0 {
log.Warnf("Callback error: %v, Or response data is empty", err)
log.Warnf("Callback error: %v, or response data is empty", err)
continue // 发送 SsoPacket 出错或返回数据为空时跳过
}
signSubmit(uin, cmd, callbackID, ret, t)
Expand Down Expand Up @@ -288,12 +292,16 @@ var lastToken = ""
func sign(seq uint64, uin string, cmd string, qua string, buff []byte) (sign []byte, extra []byte, token []byte, err error) {
i := 0
for {

sign, extra, token, err = signRequset(seq, uin, cmd, qua, buff)
cs := ss.get()
if cs == nil {
// 最好在请求后判断,否则若被设置为nil后不会再请求签名,
// 导致在下一次有请求签名服务操作之前,ss无法更新
err = errors.New("nil signserver")
log.Warn("nil sign-server") // 返回的err并不会log出来,加条日志
return
}
sign, extra, token, err = signRequset(seq, uin, cmd, qua, buff)
if err != nil {
log.Warnf("获取sso sign时出现错误: %v. server: %v", err, cs.URL)
}
Expand Down Expand Up @@ -397,7 +405,7 @@ func signStartRefreshToken(interval int64) {
cs, master := ss.get(), &base.SignServers[0]
if (cs == nil || cs.URL != master.URL) && isServerAvaliable(master.URL) {
ss.set(master)
log.Infof("主签名服务器可用,已切换至主签名服务器 %v", cs.URL)
log.Infof("主签名服务器可用,已切换至主签名服务器 %v", master.URL)
}
cs = ss.get()
if cs == nil {
Expand Down

0 comments on commit 1c34643

Please sign in to comment.