使用linux宏access_ok()有什么意义

2023-11-26

我一直在做一些研究,我对这个宏有点困惑。希望有人能给我一些指导。我有一些 ioctl 代码(我继承的,而不是编写的),它做的第一件事是检查是否access_ok()在继续从用户空间复制数据之前:

#define __lddk_copy_from_user(a,b,c) copy_from_user(a,b,c)
#define __lddk_copy_to_user(a,b,c) copy_to_user(a,b,c)

long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
  switch(cmd) {
    case COMMAND:
      if(! access_ok(VERIFY_READ, (void *)arg, sizeof(Message_par_t)))
        return(retval); 

      if(! access_ok(VERIFY_WRITE, (void *)arg, sizeof(Message_par_t)))
        return(retval); 

      argp = &Command;
      __lddk_copy_from_user( (void *) argp,(Command_par_t *) arg, sizeof(Command_par_t));

所以代码工作得很好,但我不确定是否需要它。第一个问题来自 access_ok 返回的描述:

  • 如果该区域可能可访问,则该函数返回非零(尽管访问仍可能导致 -EFAULT)。该函数只是检查该地址是否可能在用户空间中,而不是在内核中。

所以这意味着它实际上什么也不做,只是确保我们正在检查的指针是probably在用户空间初始化?因为我们知道除了用户空间调用之外我们无法进入这个函数,并且除非我们打开该设备的有效文件描述符,否则它不会发生,这真的需要吗?它真的比确保我们没有得到 NULL 指针更安全吗?

第二个问题来自这个描述:

  • 类型参数可以指定为 VERIFY_READ 或 VERIFY_WRITE。 VERIFY_WRITE 符号还标识内存区域是否可读和可写。

这是否意味着我的代码中的第一次检查是多余的?如果我们要检查可写区域,我们可以免费读取吗?

我使用的是 x86 架构,因此 access_ok() 和 __range_no_ok() 的定义来自 /usr/src/linux-3.1.10-1.16/arch/x86/include/asm/uaccess.h ,如下所示:

#define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0))

#define __range_not_ok(addr, size)                  \
({                                  \
    unsigned long flag, roksum;                 \
    __chk_user_ptr(addr);                       \
    asm("add %3,%1 ; sbb %0,%0 ; cmp %1,%4 ; sbb $0,%0"     \
        : "=&r" (flag), "=r" (roksum)               \
        : "1" (addr), "g" ((long)(size)),               \
          "rm" (current_thread_info()->addr_limit.seg));        \
    flag;                               \
})

If __lddk_copy_from_user()只需调用copy_from_user(),那么access_ok()检查是多余的,因为copy_from_user()自己执行这些检查。

The access_ok()检查确保用户空间应用程序不会要求内核读取或写入内核地址(它们是完整性/安全检查)。仅仅因为指针是由用户空间提供的,并不意味着它绝对是用户空间指针 - 在许多情况下,“内核指针”仅意味着它指向虚拟地址空间的特定区域。

另外,调用access_ok() with VERIFY_WRITE暗示VERIFY_READ,因此如果您检查前者,则无需同时检查后者。


As of this commit in 2019, access_ok() no long has the type argument, so the VERIFY_WRITE versus VERIFY_READ point is moot.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用linux宏access_ok()有什么意义 的相关文章

  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Android Material 按钮,图标位于文本之上

    是否可以有一个在其文本顶部带有图标的材质按钮 如下所示 如果是 您能用一些代码解释一下吗 谢谢 现在您可以使用该属性iconGravity top 就像是
  • 在 Pandas 中连接两个大型数据集的最佳方法

    我正在从需要连接的两个不同数据库下载两个数据集 当我将它们存储为 CSV 时 每个文件大约有 500MB 左右 分别适合内存 但当我加载两者时 有时会出现内存错误 当我尝试将它们与 pandas 合并时 我肯定会遇到麻烦 对它们进行外部连接
  • 同一域上跨页面但使用不同端口的本地存储

    我试图在同一域的各个页面上使用本地存储 但由于某种原因 如果页面使用不同的端口 Firefox 会跨页面创建相同存储数据的多个实例 所以如果我设置一些东西www example com 80去时不会持续www example com 800
  • 如何在 Zend 应用程序中将字符集设置为 UTF-8?

    我正在开发一个 Zend 应用程序 我的数据库中的数据以 utf8 unicode ci 编码 我在 application ini 中声明 resources view encoding UTF 8 但每当我尝试检索包含特殊字符的字符串时
  • 如何使图像完全适合轮播(Bootstrap)

    我已经制作了一个功能齐全的旋转木马 但问题是旋转木马的右侧出现了白色块 我想摆脱它 请帮忙 div class carousel inner div class item active img src Jellyfish jpg alt i
  • 运行简单的远程 Akka 应用程序

    我正在尝试设置一个简单的服务器 客户端 akka 使用 Akka 2 0 3 应用程序 但无法连接 在此之前 这是基本代码 import com typesafe config ConfigFactory import akka actor
  • 使用Unix JOIN命令合并两个文件

    尽管进行了所有研究 但这并没有像我预期的那样工作 我肯定错过了什么 文件1 cat file1 csv 1 123 JohnDoe 1 456 BobDylan 1 789 BillyJean 文件2 cat file2 csv 111 1
  • 是否可以让组织模式在议程待办事项列表中显示面包屑?

    在 Emacs 中 我有一组以下格式的 TODO H1 H2 H3 TODO X 当我查看议程待办事项视图时 它仅显示为TODO x 有没有办法让议程视图将其显示为H1 H2 H3 TODO X 我从以下位置找到了这个解决方案here se
  • 如何从 Java 代码调用 AWS lambda 函数/处理程序

    我是 AWS lambda 新手 我已经创建了一个带有处理程序的 lambda 函数 example Orders orderHandler 这是自定义处理程序 现在我想从我的 Java 程序中调用它 我需要如何调用它 这个类中的2个方法应
  • 什么定义了“活动”线程?

    在Java并发中 什么构成了线程 active 只是它没有空闲这一事实 从技术上来说 等待 或 挂起 的线程是否仍然被认为是活动的 据我所知 活跃 这个词似乎被经常使用 但从未被定义过 这ThreadGroup enumerate 方法记录
  • 是否可以在没有电子邮件 ID 的情况下注册 Facebook? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有关于 Facebook 注册的问题 我需要知道在不提供电子邮件 ID 的情况下使用任何手机号码或任何其他方式注册的可能性 这很重要 因为我正在开发一个 Facebook 应用
  • 如何防止 Spring MVC 在 Spring Boot 中转换为 Collection 时解释逗号?

    我们基本上有同样的问题这个问题姿势 但对于列表 此外 我们正在寻找一个全局解决方案 目前我们有一个 REST 调用 其定义如下 RequestMapping ResponseBody public Object listProducts R
  • 如何处理文本区域中的

    我想要一个可以处理按下情况的文本区域tab key 在默认情况下 如果您按tab键然后焦点离开文本区域 但是当用户想要输入时情况又如何呢 tab文本区域中的键 我可以捕获此事件并将焦点返回到文本区域并将选项卡添加到current光标位置 你
  • Python 跟踪模块 - 跟踪执行的行,但保存到文件,而不是标准输出

    我想跟踪 python 脚本的执行行 但是我使用的程序需要将内容打印到标准输出 python 跟踪模块的跟踪选项将它们打印到标准输出 有没有办法告诉它不要将它们打印到标准输出 而是将它们保存到文件中 我尝试设置outfile参数 但它不会停
  • Android 文件描述符泄漏调试

    我们公司有很多在虚拟 真实设备上运行的用户界面测试 运行一段时间后测试随机崩溃 我认为这是文件描述符超出的结果 我使用 ls proc PID fd wc l and lsof p PID 但它并没有多大帮助 lsof 中的大多数行看起来像
  • Athena 的 .csv.metadata 文件的数据格式是什么?

    的数据格式是什么 csv metadata由 Amazon Athena 编写的文件 除了每个查询的输出文件之外 还有一个元数据文件 看起来它描述了结果的架构 我认为这就是雅典娜用来创建ResultSet ResultSetMetadata
  • Oracle 中表行的创建日期时间是多少?

    昨天我的朋友 BI 专家 向我解释了一个预言机问题 有一个 Oracle 数据库包含大量数据 但它们不会为每个表创建列来存储每行的创建日期时间 所以在这种情况下他如何获得每行的创建日期时间 时间戳 每行都有自己的系统更改号 SCN 这精确地
  • 蟒蛇 |为什么访问实例属性比访问本地慢?

    import timeit class Hello def init self self x 5 def get local attr self x self x 10x10 x x x x x x x x x x x x x x x x
  • 数据流模板 Cloud Pub/Sub 主题与 BigQuery 订阅

    我正在设置一个简单的概念验证来学习 Google Cloud 中的一些概念 特别是 PubSub 和 Dataflow 我有一个 PubSub 主题greeting 我创建了一个简单的云函数 用于向该主题发送发布消息 const escap
  • 使用linux宏access_ok()有什么意义

    我一直在做一些研究 我对这个宏有点困惑 希望有人能给我一些指导 我有一些 ioctl 代码 我继承的 而不是编写的 它做的第一件事是检查是否access ok 在继续从用户空间复制数据之前 define lddk copy from use