赋予模块参数S_IWUGO权限会导致编译错误(虽然S_IRUGO或S_IXUGO没有) - 为什么?

时间:2015-07-13 18:14:49

标签: linux permissions linux-kernel compilation

我写了一个简单的内核模块来学习内核模块的module_param特性。但是,如果我为S_IWUGO, S_IRWXUGO字段授予S_IALLUGOperm权限,则会收到以下编译错误:

[root@localhost param]# make -C $KDIR M=$PWD modules 
make: Entering directory `/usr/src/kernels/3.11.10-301.fc20.i686+PAE'
  CC [M]  /root/ldd/misc/param/param/hello.o
/root/ldd/misc/param/param/hello.c:6:168: error: negative width in bit-field ‘<anonymous>’
 module_param(a, int, S_IWUGO);
                                                                                                                                                                        ^
make[1]: *** [/root/ldd/misc/param/param/hello.o] Error 1
make: *** [_module_/root/ldd/misc/param/param] Error 2
make: Leaving directory `/usr/src/kernels/3.11.10-301.fc20.i686+PAE'

S_IRUGO or S_IXUGO的编译成功(权限不包含Write permssion)。我想我必须做错事,因为据我所知,许可是合法的。我在这里做错了什么?

该计划:

#include<linux/module.h>
#include<linux/stat.h>

int a = 2;

module_param(a, int, S_IXUGO);

int f1(void){

        return 0;
}

void f2(void){

}

module_init(f1);
module_exit(f2);

MODULE_AUTHOR("lavya");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("experiment with parameters");

1 个答案:

答案 0 :(得分:1)

Linux不接受S_IWOTH权限。 如果您关注module_param后面的宏链,则会转到 __module_param_call,其中包括:

BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2))

S_IWOTH == 2因此测试失败。

negative width in bit-field错误仅仅是implementation of BUILD_BUG_ON_ZERO

的假象

出于安全原因,Linux可能拒绝将模块参数设置为全局可写。您应该能够使用较窄的权限,例如S_IWUSR | S_IWGRP