看了一下英文原文,貌似这中文的说得不对?
https://lkml.org/lkml/2022/2/17/1032
问题是出在transient path中,也就是cpu做分支预测时,预测错误了的那个分支。
list遍历时,循环结束条件是"xxx != (head)"。到链表的尾部节点时,对这个条件有两种预测,
一种是xxx == (head),这是正确的分支,导致循环结束;
一种是xxx != (head),这个是错误的预测分支,也就是transient path。这种情况下还会去尝试访问xxx指向的节点的内容,如果xxx指向的结构中有用户可控的内容,就可能导致安全问题。
所以这个问题应该和宏机制、C89没关系,就是因为在transient path中访问了用户可控的内容。是由于这种链表的实现结构导致的。
实际上windows平台的driver也大量使用了这种list访问(估计有些可能也有这问题),一般人不敢在driver中使用复杂结构比如红黑树之类的。
--
FROM 114.241.225.*