1

我的程序在已写入用户指定目录的二进制文件上调用 exec()。如果该目录位于使用“noexec”挂载的树中,则 exec() 将失败并显示 EACCES。

我不想让 exec() 失败,而是希望能够确定一个目录是否使用 noexec 挂载,但 fcntl()、stat() 或 mount() 都没有返回此信息(通过阅读手册页)。查看 exec 系统调用的内核源代码,看起来此信息存储在 inode 的元数据中,我没有看到任何系统调用返回此信息。

 673     struct nameidata nd;
 (..)
 677     err = path_lookup_open(AT_FDCWD, name, LOOKUP_FOLLOW, &nd, FMODE_READ|FMODE_EXEC);
 678     file = ERR_PTR(err);
 (..)
 682         file = ERR_PTR(-EACCES);
 683         if (!(nd.mnt->mnt_flags & MNT_NOEXEC) &&
 684             S_ISREG(inode->i_mode)) {

有谁知道这样做的方法?

谢谢。

4

2 回答 2

2

你可以使用statvfs ()

struct statvfs st;
inr rc = statvfs("/mnt/foo", &st);
if (rc == -1)
   error();
if (st.f_flag & ST_NOEXEC) {
 //no exec flags was set
}
于 2013-03-29T21:16:24.410 回答
0

您是否考虑过阅读/proc/mounts然后确定您的程序二进制文件所在的文件系统,也许使用statfs(2)和/或realpath(3)

但是您始终应该关心并处理execve(2)和相关exec函数的失败,这些失败可能由于多种原因而失败。

失败的方法有很多execve,其中一些不容易重现;同样对于失败fork或任何其他系统调用。

我会离开并报告EACCESS错误 (of execve),或者,如果您绝对想捕获并解释更多mount 选项,请在此类 失败后noexec执行更复杂的事情(statfs和/或realpath扫描/proc/mountsor )。/proc/self/mountsEACCESS

在 -ing之前测试二进制路径没有多大意义execve......只是在......之后报告错误

于 2013-03-29T20:51:26.417 回答