加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在卸载的文件上执行mmap()后避免崩溃

发布时间:2020-12-15 21:46:27 所属栏目:安全 来源:网络整理
导读:我正在对可以卸载的文件执行mmap()(该文件位于用户可以随时删除的USB设备上),如果文件已卸载,我的应用程序崩溃然后我尝试访问任何元素在缓冲区. 对此有何解决方案? 解决方法 首先,我想说这应该作为一个很好的论据,不要不必要地使用mmap作为“优化读
我正在对可以卸载的文件执行mmap()(该文件位于用户可以随时删除的USB设备上),如果文件已卸载,我的应用程序崩溃然后我尝试访问任何元素在缓冲区.

对此有何解决方案?

解决方法

首先,我想说这应该作为一个很好的论据,不要不必要地使用mmap作为“优化读取”或类似的.除了设备删除之外,其他进程的文件截断等问题都可能导致访问SIGBUS的错误.

如果确实需要使用mmap,可以为SIGBUS安装信号处理程序.它的任务基本上应该是:

>设置一个全局(或线程本地,如果您的程序是多线程的)标志SIGBUS发生,因此错误代码可以知道.
>使用MAP_FIXED调用mmap,将新的匿名页面映射到错误页面的顶部.可选地填充数据,该数据将被访问地图的代码识别为错误的;这可能使第1步不必要.

另一种方法是在访问映射之前设置全局(或线程局部)jmp_buf,并让信号处理程序简单地调用longjmp.

请注意,mmap和longjmp都不是异步信号安全的,但所讨论的SIGBUS不是异步信号(尽管如果故障访问发生在非同步信号安全库函数内,例如sscanf,它应该被视为一个) ).只要它是你自己的代码,而不是库函数,访问地图,你应该是安全的.并且mmap在大多数/所有实际实现中都是异步信号安全的,所以即使它不是正式的,你也应该在实践中使用第一个解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读