0

我被困在修复一些遗留的 RAID 代码(是的,我拉了最短的一根稻草)。

这是我找到的一段代码。

#define FLAG_LENGTH 256

#code
char str[FLAG_LENGTH-1]

strlcat(&str,source_ptr,FLAG_LENGTH);

str 声明上方有一条评论说大小减少 1 是有充分理由的,但慷慨的评论作者没有提到“充分的理由”。

如果我正确理解 strlcat 的实现,无论如何它都会终止所有字符串,并且如果 256 会将其添加到大小为 255 的字符串(即最后一个索引 254)的第 256 个字符(即索引 255)中,则它会终止所有字符串。我们是否溢出了细绳??或者这样做是否有一些隐藏的天才(纯粹根据评论询问)

4

2 回答 2

3

是的,这段代码是危险的错误。真的没什么好说的了。我猜有人不小心写了 -1 而不是 +1,但是数组的大小和传递给strlcat.

顺便说一句,我认为这种错误可以很好地说明为什么神奇的“安全”字符串接口不是灵丹妙药。编写可靠的代码不需要做白痴。语言或库功能不会保护您免受自己的愚蠢。

于 2012-11-07T06:56:04.747 回答
0

天哪,为什么人们不费心阅读文档?

如果您阅读 Miller/de Raadt 的原始论文,上面的代码应该是:

strlcat(src, source_ptr, sizeof(src));
于 2014-03-13T21:59:52.590 回答