Lagrange.Core icon indicating copy to clipboard operation
Lagrange.Core copied to clipboard

Binary packet complains Arithmetic operation resulted in an overflow

Open TheSnowfield opened this issue 1 year ago • 5 comments

Platform: Allwinner H3(armhf) with 1GB RAM Lagrange Ver: latest

[2024-03-26 16:58:26.736] [Debug] [ServiceContext] Outgoing SSOFrame: wtlogin.trans_emp
[2024-03-26 16:58:30.376] [Fatal] [SocketContext] Socket Error: Arithmetic operation resulted in an overflow.
[2024-03-26 16:58:30.441] [Fatal] [SocketContext]    at Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes(Int32 count) in /root/Kagami/Lagrange.Core/Lagrange.Core/Utility/Binary/BinaryPacket.cs:line 242
   at Lagrange.Core.Utility.Binary.BinaryPacket.ReadString(Prefix flag) in /root/Kagami/Lagrange.Core/Lagrange.Core/Utility/Binary/BinaryPacket.cs:line 256
   at Lagrange.Core.Internal.Packets.SsoPacker.Parse(BinaryPacket packet) in /root/Kagami/Lagrange.Core/Lagrange.Core/Internal/Packets/SsoPacker.cs:line 65
   at Lagrange.Core.Internal.Context.PacketContext.DispatchPacket(BinaryPacket packet) in /root/Kagami/Lagrange.Core/Lagrange.Core/Internal/Context/PacketContext.cs:line 91
   at Lagrange.Core.Internal.Context.SocketContext.OnRecvPacket(ReadOnlySpan`1 packet) in /root/Kagami/Lagrange.Core/Lagrange.Core/Internal/Context/SocketContext.cs:line 68
   at Lagrange.Core.Internal.Network.CallbackClientListener.OnRecvPacket(ReadOnlySpan`1 packet) in /root/Kagami/Lagrange.Core/Lagrange.Core/Internal/Network/CallbackClientListener.cs:line 15
   at Lagrange.Core.Internal.Network.ClientListener.ReceiveLoop(SocketSession session, CancellationToken token) in /root/Kagami/Lagrange.Core/Lagrange.Core/Internal/Network/ClientListener.cs:line 139
[2024-03-26 16:58:30.447] [Fatal] [SocketContext] Socket Disconnected, Scheduling Reconnect

TheSnowfield avatar Mar 26 '24 17:03 TheSnowfield

同样的问题在另一个平台上

版本:https://github.com/KonataDev/Lagrange.Core/actions/runs/8881050412 系统:Ubuntu 20.04 amd64 平台:Lagrange OneBot

trce: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:00] [ServiceContext] [DEBUG]: Outgoing
SSOFrame: trpc.login.ecdh.EcdhService.SsoKeyExchange
warn: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:01] [BusinessContext] [WARNING]: Error
while handling msf push: 12
warn: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:01] [BusinessContext] [WARNING]: Arithm
etic operation resulted in an overflow.
warn: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:01] [BusinessContext] [WARNING]:    at
Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes(Int32 count
)
         at Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes
(Prefix flag)
         at Lagrange.Core.Internal.Context.ServiceContext.Resol
veEventByPacket(SsoPacket packet)
         at Lagrange.Core.Internal.Context.BusinessContext.Hand
leServerPacket(SsoPacket packet)
trce: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:01] [BusinessContext] [DEBUG]:
trce: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:10] [ServiceContext] [DEBUG]: Outgoing
SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:20] [ServiceContext] [DEBUG]: Outgoing
SSOFrame: Heartbeat.Alive
trce: Lagrange.Core.BotContext[0]
      [2024-04-30 23:09:30] [ServiceContext] [DEBUG]: Outgoing
SSOFrame: Heartbeat.Alive
(以下重复)

zhanbao2000 avatar Apr 30 '24 15:04 zhanbao2000

使用最新的docker镜像部署确认可以复现

synodriver avatar May 02 '24 12:05 synodriver

尝试删除了 keystore.json 从而重新登录,问题依旧

trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:57] [ServiceContext] [DEBUG]: Outgoing SSOFrame: trpc.login.ecdh.EcdhService.SsoKeyExchange
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:57] [ServiceContext] [DEBUG]: Incoming SSOFrame: trpc.login.ecdh.EcdhService.SsoKeyExchange
info: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:57] [WtExchangeLogic] [INFORMATION]: Key Exchange successfully!
info: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:57] [WtExchangeLogic] [INFORMATION]: Trying to Login by Password...
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [ServiceContext] [DEBUG]: Outgoing SSOFrame: trpc.login.ecdh.EcdhService.SsoNTLoginPasswordLogin
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [ServiceContext] [DEBUG]: Incoming SSOFrame: trpc.login.ecdh.EcdhService.SsoNTLoginPasswordLogin
info: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [WtExchangeLogic] [INFORMATION]: Login Success
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [ServiceContext] [DEBUG]: Outgoing SSOFrame: trpc.qq_new_tech.status_svc.StatusService.Register
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [BusinessContext] [WARNING]: Error when processing the event: Lagrange.Core.Internal.Event.System.StatusRegisterEvent
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [BusinessContext] [WARNING]: Packet 'trpc.qq_new_tech.status_svc.StatusService.Register' returns -10003 with seq: 5695743, extra: 身份验证失败,请你重新登录 (s21)
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:01:58] [BusinessContext] [WARNING]:    at Lagrange.Core.Internal.Context.BusinessContext.SendEvent(ProtocolEvent event)
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:06] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:07] [BusinessContext] [WARNING]: Error while handling msf push: 12 Heartbeat.Alive
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:07] [BusinessContext] [WARNING]: Arithmetic operation resulted in an overflow.
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:07] [BusinessContext] [WARNING]:    at Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes(Int32 count)
         at Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes(Prefix flag)
         at Lagrange.Core.Internal.Context.ServiceContext.ResolveEventByPacket(SsoPacket packet)
         at Lagrange.Core.Internal.Context.BusinessContext.HandleServerPacket(SsoPacket packet)
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:07] [BusinessContext] [DEBUG]: 
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:16] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:17] [BusinessContext] [WARNING]: Error while handling msf push: 12 Heartbeat.Alive
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:17] [BusinessContext] [WARNING]: Arithmetic operation resulted in an overflow.
warn: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:17] [BusinessContext] [WARNING]:    at Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes(Int32 count)
         at Lagrange.Core.Utility.Binary.BinaryPacket.ReadBytes(Prefix flag)
         at Lagrange.Core.Internal.Context.ServiceContext.ResolveEventByPacket(SsoPacket packet)
         at Lagrange.Core.Internal.Context.BusinessContext.HandleServerPacket(SsoPacket packet)
trce: Lagrange.Core.BotContext[0]
      [2024-05-03 00:02:17] [BusinessContext] [DEBUG]:
(以下重复)

尝试在 appsettings.json 中删除 Password 字段,从而使用扫码登陆,能正常登录并收发消息

再次删除 keystore.json,尝试使用密码登录,问题依旧,打印日志与上述一致

zhanbao2000 avatar May 02 '24 16:05 zhanbao2000

根據我的經驗,這個問題很有可能是因爲在arm設備上性能不足產生的邏輯問題, 可以往這個方向去排查。 參考: https://github.com/KonataDev/Konata.Core/issues/121

TheSnowfield avatar May 04 '24 19:05 TheSnowfield

调查结论如下: BinaryPacket 实现里边的 Read 相关方法并没有检查 eof 的情况 PacketContext.DispatchPacket 中 L91 返回的 SsoPacket.Payload 里边实际上装的是一个空的 byte[] 稍后调用 Collection.Business.HandleServerPacket(sso) 时, 其中 var events = Collection.Service.ResolveEventByPacket(packet) 里边调用到 var payload = packet.Payload.ReadBytes(Prefix.Uint32 | Prefix.WithPrefix); 时, 由于 BinaryPacket.ReadUint 对空的 byte[] 进行读取会返回0, 导致 BinaryPacket.ReadBytes 试图创建一个长度为 -4 的数组, 引发 System.OverflowException 异常

cc @Linwenxuan05 @TheSnowfield

Executor-Cheng avatar May 05 '24 11:05 Executor-Cheng

删除keystore可能可以解决之(有待更多验证)

synodriver avatar Jun 23 '24 06:06 synodriver