Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【BUG】发送超长消息时,空指针引用的错误 #640

Closed
LennyDream opened this issue Feb 14, 2021 · 2 comments
Closed

【BUG】发送超长消息时,空指针引用的错误 #640

LennyDream opened this issue Feb 14, 2021 · 2 comments
Labels
bug Something isn't working

Comments

@LennyDream
Copy link

LennyDream commented Feb 14, 2021

环境信息:
go-cqhttp版本: go-cqhttp-v0.9.40
运行环境: windows_amd64
连接方式: 反向WS

BUG内容:
问题重现:发送超长群聊消息时,解析时出现空指针引用

消息长度已超过10w字节,在千人群中调用get_group_member_list的json结果,直接发送群消息send_group_msg

// 1> MiriaGo类库中函数有问题 SendGroupMessage消息长度判断有问题
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage {
	useFram := false
	if len(f) > 0 {
		useFram = f[0]
	}
	imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
	if useFram {
		if m.Any(func(e message.IMessageElement) bool { return e.Type() == message.Reply }) {
			useFram = false
		}
	}
	msgLen := message.EstimateLength(m.Elements, 703)
	if msgLen > 5000 || imgCount > 50 { //!!这个条件应该走不到了,EstimateLength参数最长703限制
		return nil
	}
	if (msgLen > 100 || imgCount > 2) && !useFram {
		ret := c.sendGroupMessage(groupCode, false,
			&message.SendingMessage{Elements: []message.IMessageElement{
				c.uploadGroupLongMessage(groupCode,
					&message.ForwardMessage{Nodes: []*message.ForwardNode{
						{
							SenderId:   c.Uin,
							SenderName: c.Nickname,
							Time:       int32(time.Now().Unix()),
							Message:    m.Elements,
						},
					}},
				),
			}},
		)
		return &message.GroupMessage{
			Id:         ret.Id,
			InternalId: ret.InternalId,
			GroupCode:  ret.GroupCode,
			Sender:     ret.Sender,
			Time:       ret.Time,
			Elements:   m.Elements,
		}
	}
	return c.sendGroupMessage(groupCode, false, m)
}

// 2> 此函数返回nil
func (c *QQClient) multiMsgApplyUp(groupCode int64, data []byte, hash []byte, buType int32) (*multimsg.MultiMsgApplyUpRsp, []byte, error) {
	i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, buType, utils.ToGroupUin(groupCode)))
	if err != nil { // !!此处直接返回错误,err内容 too large
		return nil, nil, err
	}
        //...
}

// 3> message.go:309 行,elem为nil
for _, elem := range elems {
	if e, ok := elem.(*ShortVideoElement); ok {
		r = e.Pack()
		break
	}
	if e, ok := elem.(IRichMessageElement); ok { // !!此处elem为nil
		r = append(r, e.Pack()...)
	}
}

调试堆栈如下
github.com/Mrs4s/MiraiGo/message.ToProtoElems at message.go:310
github.com/Mrs4s/MiraiGo/client.(*QQClient).buildGroupSendingPacket at group_msg.go:255
github.com/Mrs4s/MiraiGo/client.(*QQClient).sendGroupMessage at group_msg.go:129
github.com/Mrs4s/MiraiGo/client.(*QQClient).SendGroupMessage at group_msg.go:50
github.com/Mrs4s/go-cqhttp/coolq.(*CQBot).SendGroupMessage at bot.go:221
github.com/Mrs4s/go-cqhttp/coolq.(*CQBot).CQSendGroupMessage at api.go:239
github.com/Mrs4s/go-cqhttp/server.glob..func9 at websocket.go:413
github.com/Mrs4s/go-cqhttp/server.(*webSocketConn).handleRequest at websocket.go:333
runtime.goexit at asm_amd64.s:1374
Async stack trace
github.com/Mrs4s/go-cqhttp/server.(*WebSocketClient).listenAPI at websocket.go:185

报错日志信息
[2021-02-15 01:39:52] [INFO]: 处置WS命令时发生无法恢复的异常:runtime error: invalid memory address or nil pointer dereference
goroutine 14979 [running]:
runtime/debug.Stack(0x0, 0x0, 0x0)
E:/GoSDK/go1.15/src/runtime/debug/stack.go:24 +0xac
github.com/Mrs4s/go-cqhttp/server.(*webSocketConn).handleRequest.func1(0xc000ab1130)
E:/Code/02Go/01qqrobot/go-cqhttp-master/server/websocket.go:324 +0x6f
panic(0xf75aa0, 0x166e300)
E:/GoSDK/go1.15/src/runtime/panic.go:975 +0x414
github.com/Mrs4s/MiraiGo/message.(*ServiceElement).Pack(0x0, 0x16bfaf8, 0x0, 0x0)
E:/GoSDK/gopath/pkg/mod/github.com/!mrs4s/!mirai!go@v0.0.0-20210206134348-800bf525ed0e/message/pack.go:130 +0x86
github.com/Mrs4s/MiraiGo/message.ToProtoElems(0xc000be4060, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0)
E:/GoSDK/gopath/pkg/mod/github.com/!mrs4s/!mirai!go@v0.0.0-20210206134348-800bf525ed0e/message/message.go:310 +0x1519
github.com/Mrs4s/MiraiGo/client.(*QQClient).buildGroupSendingPacket(0xc0004c6c00, 0x1a074257, 0x1d413b3f7, 0x0, 0x0, 0xc000be4060, 0x1, 0x1, 0xc000700000, 0x0, ...)
E:/GoSDK/gopath/pkg/mod/github.com/!mrs4s/!mirai!go@v0.0.0-20210206134348-800bf525ed0e/client/group_msg.go:255 +0x259
github.com/Mrs4s/MiraiGo/client.(*QQClient).sendGroupMessage(0xc0004c6c00, 0x1a074257, 0xc00042d200, 0xc00042d218, 0x0)
E:/GoSDK/gopath/pkg/mod/github.com/!mrs4s/!mirai!go@v0.0.0-20210206134348-800bf525ed0e/client/group_msg.go:129 +0xd2c
github.com/Mrs4s/MiraiGo/client.(*QQClient).SendGroupMessage(0xc0004c6c00, 0x1a074257, 0xc00042d940, 0xc000e6d2ea, 0x1, 0x1, 0x0)
E:/GoSDK/gopath/pkg/mod/github.com/!mrs4s/!mirai!go@v0.0.0-20210206134348-800bf525ed0e/client/group_msg.go:50 +0x4a5
github.com/Mrs4s/go-cqhttp/coolq.(*CQBot).SendGroupMessage(0xc00036ef00, 0x1a074257, 0xc000e6d940, 0x0)
E:/Code/02Go/01qqrobot/go-cqhttp-master/coolq/bot.go:221 +0x510
github.com/Mrs4s/go-cqhttp/coolq.(*CQBot).CQSendGroupMessage(0xc00036ef00, 0x1a074257, 0x107f440, 0xc00009c140, 0x0, 0x0)
E:/Code/02Go/01qqrobot/go-cqhttp-master/coolq/api.go:239 +0x335
github.com/Mrs4s/go-cqhttp/server.glob..func9(0xc00036ef00, 0x5, 0xc00170002d, 0x85f56, 0x0, 0x0, 0x0, 0x2d, 0x0)
E:/Code/02Go/01qqrobot/go-cqhttp-master/server/websocket.go:413 +0x2d6
github.com/Mrs4s/go-cqhttp/server.(*webSocketConn).handleRequest(0xc000ab1130, 0xc00036ef00, 0xc001600000, 0x85f85, 0xffe00)
E:/Code/02Go/01qqrobot/go-cqhttp-master/server/websocket.go:333 +0x509
created by github.com/Mrs4s/go-cqhttp/server.(*WebSocketClient).listenAPI
E:/Code/02Go/01qqrobot/go-cqhttp-master/server/websocket.go:185 +0x37a

@Mrs4s Mrs4s added the bug Something isn't working label Feb 16, 2021
@Mrs4s
Copy link
Owner

Mrs4s commented Feb 17, 2021

没想到会有人发这么长的消息...

@Mrs4s
Copy link
Owner

Mrs4s commented Feb 19, 2021

已修复

@Mrs4s Mrs4s closed this as completed Feb 19, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants