Skip to content

Conversation

@Abingcbc
Copy link
Collaborator

@Abingcbc Abingcbc commented Jul 18, 2025

核心问题是这一段
image
SenderQueueItem是被DiskBuffer从发送队列clone保存的,但其中的flusher是一个指针。当force stop DiskBuffer的时候,flusher可能已经被释放了,但C++访问一个被释放的类的属性是未定义的,通常是可以获取的。但也没办法判断flusher是否已释放,所以只能在读取时拦截。

修复方案

问题一:超大,导致内存暴涨

通过protobuf流式读取。当size超大时,预读取前16KB,判断其中的元信息的几个字段是否超长,排除数据本身超大导致的错判。

问题二:aliuid长度合法,但内容错误

aliuid一定为纯数字组成。校验其每位是否为数字。


// if encodedInfoSize > BUFFER_DATA_MAX_SIZE, then read encodedInfoSize bytes from file, and validate fields
if (encodedInfoSize > BUFFER_DATA_MAX_SIZE) {
if (!PartialReadAndValidateKeyFields(fin, encodedInfoSize, pbMeta, filename)) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没有任何ut?

@yyuuttaaoo
Copy link
Collaborator

请确保flusher指针有效,请修复写入时的问题

@linrunqi08
Copy link
Collaborator

我也是担心这种处理并不解决根本问题,比如可能修复了80%的可能,但是仍然不是最优方案

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants