c - 从内核空间的文件指针获取fd

标签 c linux-kernel file-permissions kernel

给定一个结构体文件,是否可以在Linux内核空间中获取关联的文件描述符?我正在尝试使用 sys_chmod 或 sys_fchmod 更改权限。一个获取文件描述符,另一个期望来自用户空间的文件名。我可以弄清楚如何获取文件名,但如何将其转换为用户空间指针?

谢谢

最佳答案

您需要的函数是chmod_common:

static int chmod_common(struct path *path, umode_t mode)

它需要一个路径和您想要设置的模式。不幸的是,正如您所注意到的,它是静态的并且显然没有导出。所以你可以采取多种方式:

  • 在您自己的函数中复制它所做的任何事情
  • struct file获取“文件描述符”(丑陋)
  • 找到一种方法来调用sys_chmod

现在sys_chmod需要一个用户指针,但你在内核中。您可以采取以下措施来欺骗它:

mm_segment_t oldfs = get_fs();

char __user *userptr;
userptr = (char __user __force *) kernptr;

set_fs(KERNEL_DS);

/* call sys_chmod */

set_fs(oldfs);

这一切都非常符合"things you never should do in the Kernel" .

关于c - 从内核空间的文件指针获取fd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14913965/

相关文章:

c - 使用声明的变量分配内存是否定义了行为?

linux - 为什么VFS函数同时获取struct inode和file?

windows - openssh windows 错误的所有者或权限

ruby - Rake cp 权限在 Windows 上被拒绝

linux - 为 beaglebone black 将 Robert Nelson 的 Linux 内核构建到 Yocto(daisy) 中

android - 阻止其他应用程序访问存储在 SD 卡中的我的应用程序图像

python - 用C从Chrome中解密 "Saved Password"

c - Makefile - 仅生成两个库之一

c - 发送信号和 pselect?

linux - 为什么 syslog 文件中的内核日志消息(或那些重定向到终端的消息)正好落后一个 'message'?