mt6735Mediaserver在开机过程中没有权限在 /data/system目录下创建文件
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
在ICS上,Mediaserver在开机过程中没有权限在/data/system目录下创建文件
[SOLUTION]
这个问题是由于在原始代码中,透过capset对mediaserver权限进行了限定:
mediaserver初始化时的main_mediaserver.cpp:
if(AID_root==getuid()){
LOGI("[%s]setmediaservercapinrootmode,adjustitforthreadRTschedulepolicy",__func__);
if(-1==prctl(PR_SET_KEEPCAPS,1,0,0,0)){
LOGW("mediaserverprctlforsetcapsfailed:%s",strerror(errno));
}else{
__user_cap_header_structhdr;
__user_cap_data_structdata;
hdr.version=_linux_CAPABILITY_VERSION;//setcaps
hdr.pid=getpid();
data.effective=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID));
data.permitted=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID));
data.inheritable=0xffffffff;
if(-1==capset(&hdr,&data)){
LOGW("mediaservercapsettingfailed,%s",strerror(errno));
}
}
已经把root的权限先使用prctl进行keep,然后通过capset进行了限制。后面不能创建的关键点就在于capset的限制过程中,将目录访问的权限消除掉了,导致后面无法创建,修改如下:
data.effective=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID)|(1<<CAP_DAC_OVERRIDE));
data.permitted=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID)|(1<<CAP_DAC_OVERRIDE));
这样就可以保留下目录的访问控制权限,后面再创建文件就没有问题了。
注:
CAP_DAC_OVERRIDE Bypassfileread,write,andexecutepermissionchecks.(DACisan abbreviationof"discretionaryaccesscontrol".)
在ICS上,Mediaserver在开机过程中没有权限在/data/system目录下创建文件
[SOLUTION]
这个问题是由于在原始代码中,透过capset对mediaserver权限进行了限定:
mediaserver初始化时的main_mediaserver.cpp:
if(AID_root==getuid()){
LOGI("[%s]setmediaservercapinrootmode,adjustitforthreadRTschedulepolicy",__func__);
if(-1==prctl(PR_SET_KEEPCAPS,1,0,0,0)){
LOGW("mediaserverprctlforsetcapsfailed:%s",strerror(errno));
}else{
__user_cap_header_structhdr;
__user_cap_data_structdata;
hdr.version=_linux_CAPABILITY_VERSION;//setcaps
hdr.pid=getpid();
data.effective=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID));
data.permitted=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID));
data.inheritable=0xffffffff;
if(-1==capset(&hdr,&data)){
LOGW("mediaservercapsettingfailed,%s",strerror(errno));
}
}
已经把root的权限先使用prctl进行keep,然后通过capset进行了限制。后面不能创建的关键点就在于capset的限制过程中,将目录访问的权限消除掉了,导致后面无法创建,修改如下:
data.effective=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID)|(1<<CAP_DAC_OVERRIDE));
data.permitted=((1<<CAP_SYS_NICE)|(1<<CAP_SETUID)|(1<<CAP_SETGID)|(1<<CAP_DAC_OVERRIDE));
这样就可以保留下目录的访问控制权限,后面再创建文件就没有问题了。
注:
CAP_DAC_OVERRIDE Bypassfileread,write,andexecutepermissionchecks.(DACisan abbreviationof"discretionaryaccesscontrol".)