Closed ghost closed 3 years ago
potential memory leak and buffer overflow.
CommandNode::parse 内存泄漏 -> 触发条件: 解析最后一个arg时,arg无效。 -> 触发位置: CommandNode.cpp:L47-L65 -> 触发原理: 无论arg是否解析成功,都申请了一个ArgHolder,但是L66处判断了arg解析是否成功,并且 只释放 成功解析的arg。若arg解析失败,则内存泄漏。
CommandNode::parse 缓冲区溢出 -> 触发条件: tokens.size()==1 && 解析失败 -> 触发位置: CommandNode.cpp:L73-L74 -> 触发原理: 当解析失败后,在L44向用户提示错误后,仍然向下执行,直到L72的遍历查找,当执行node.second->getName() == tokens[idx]时,由于idx>=tokens.size() (idx==1),出现缓冲区溢出。考虑到vector的预分配特性,tokens[1]可能仍然在一个可以正常访问的已分配堆区域。但是由于执行了字符串的比较操作,而tokens[1]内部的内容不确定,从而导致缓冲区溢出并崩溃。
已经修复2 fd014eb6308afc14e460c7c58ded0ac355fcd711 感谢大佬
potential memory leak and buffer overflow.
CommandNode::parse 内存泄漏 -> 触发条件: 解析最后一个arg时,arg无效。 -> 触发位置: CommandNode.cpp:L47-L65 -> 触发原理: 无论arg是否解析成功,都申请了一个ArgHolder,但是L66处判断了arg解析是否成功,并且 只释放 成功解析的arg。若arg解析失败,则内存泄漏。
CommandNode::parse 缓冲区溢出 -> 触发条件: tokens.size()==1 && 解析失败 -> 触发位置: CommandNode.cpp:L73-L74 -> 触发原理: 当解析失败后,在L44向用户提示错误后,仍然向下执行,直到L72的遍历查找,当执行node.second->getName() == tokens[idx]时,由于idx>=tokens.size() (idx==1),出现缓冲区溢出。考虑到vector的预分配特性,tokens[1]可能仍然在一个可以正常访问的已分配堆区域。但是由于执行了字符串的比较操作,而tokens[1]内部的内容不确定,从而导致缓冲区溢出并崩溃。