提交 e425187d 编写于 作者: H Haryslee

fix: 修复mprotect修改地址区间的权限后,相应的区间名丢失问题

背景:对于mmap映射的区间,修改权限后对应的区间名丢失
方案:mprotect修改权限后,对应区间名继承原区间名

close #I43R40
Signed-off-by: NHaryslee <lihao189@huawei.com>
Change-Id: I969c93528cbecc2ded4e437e5aac8f82b8baa609
上级 d169cad6
...@@ -257,7 +257,28 @@ REGION_ALLOC_FAILED: ...@@ -257,7 +257,28 @@ REGION_ALLOC_FAILED:
return ret; return ret;
} }
int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot) STATIC UINT32 OsInheritOldRegionName(UINT32 oldRegionFlags)
{
UINT32 vmFlags = 0;
if (oldRegionFlags & VM_MAP_REGION_FLAG_HEAP) {
vmFlags |= VM_MAP_REGION_FLAG_HEAP;
} else if (oldRegionFlags & VM_MAP_REGION_FLAG_STACK) {
vmFlags |= VM_MAP_REGION_FLAG_STACK;
} else if (oldRegionFlags & VM_MAP_REGION_FLAG_TEXT) {
vmFlags |= VM_MAP_REGION_FLAG_TEXT;
} else if (oldRegionFlags & VM_MAP_REGION_FLAG_VDSO) {
vmFlags |= VM_MAP_REGION_FLAG_VDSO;
} else if (oldRegionFlags & VM_MAP_REGION_FLAG_MMAP) {
vmFlags |= VM_MAP_REGION_FLAG_MMAP;
} else if (oldRegionFlags & VM_MAP_REGION_FLAG_SHM) {
vmFlags |= VM_MAP_REGION_FLAG_SHM;
}
return vmFlags;
}
INT32 LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot)
{ {
LosVmSpace *space = OsCurrProcessGet()->vmSpace; LosVmSpace *space = OsCurrProcessGet()->vmSpace;
LosVmMapRegion *region = NULL; LosVmMapRegion *region = NULL;
...@@ -291,7 +312,7 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot) ...@@ -291,7 +312,7 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot)
len = LOS_Align(len, PAGE_SIZE); len = LOS_Align(len, PAGE_SIZE);
/* can't operation cross region */ /* can't operation cross region */
if (region->range.base + region->range.size < vaddr + len) { if ((region->range.base + region->range.size) < (vaddr + len)) {
ret = -EINVAL; ret = -EINVAL;
goto OUT_MPROTECT; goto OUT_MPROTECT;
} }
...@@ -303,6 +324,7 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot) ...@@ -303,6 +324,7 @@ int LOS_DoMprotect(VADDR_T vaddr, size_t len, unsigned long prot)
vmFlags = OsCvtProtFlagsToRegionFlags(prot, 0); vmFlags = OsCvtProtFlagsToRegionFlags(prot, 0);
vmFlags |= (region->regionFlags & VM_MAP_REGION_FLAG_SHARED) ? VM_MAP_REGION_FLAG_SHARED : 0; vmFlags |= (region->regionFlags & VM_MAP_REGION_FLAG_SHARED) ? VM_MAP_REGION_FLAG_SHARED : 0;
vmFlags |= OsInheritOldRegionName(region->regionFlags);
region = LOS_RegionFind(space, vaddr); region = LOS_RegionFind(space, vaddr);
if (region == NULL) { if (region == NULL) {
ret = -ENOMEM; ret = -ENOMEM;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册