You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.7 KiB
43 lines
1.7 KiB
6 years ago
|
From ef55290ab88bb9a640bb0ab7213b6827c7207ee6 Mon Sep 17 00:00:00 2001
|
||
|
From: Sugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
|
||
|
Date: Fri, 5 Jan 2018 00:01:30 +0900
|
||
|
Subject: [PATCH 149/454] vcsm: Support for finding user/vc handle in memory
|
||
|
pool
|
||
|
|
||
|
vmcs_sm_{usr,vc}_handle_from_pid_and_address() were failing to find
|
||
|
handle if specified user pointer is not exactly the one that the memory
|
||
|
locking call returned even if the pointer is in range of map/resource.
|
||
|
So fixed the functions to match the range.
|
||
|
|
||
|
Signed-off-by: Sugizaki Yukimasa <i.can.speak.c.and.basic@gmail.com>
|
||
|
---
|
||
|
drivers/char/broadcom/vc_sm/vmcs_sm.c | 10 ++++++++--
|
||
|
1 file changed, 8 insertions(+), 2 deletions(-)
|
||
|
|
||
|
--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c
|
||
|
+++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c
|
||
|
@@ -276,7 +276,10 @@ static unsigned int vmcs_sm_vc_handle_fr
|
||
|
/* Lookup the resource. */
|
||
|
if (!list_empty(&sm_state->map_list)) {
|
||
|
list_for_each_entry(map, &sm_state->map_list, map_list) {
|
||
|
- if (map->res_pid != pid || map->res_addr != addr)
|
||
|
+ if (map->res_pid != pid)
|
||
|
+ continue;
|
||
|
+ if (!(map->res_addr <= addr &&
|
||
|
+ addr < map->res_addr + map->resource->res_size))
|
||
|
continue;
|
||
|
|
||
|
pr_debug("[%s]: global map %p (pid %u, addr %lx) -> vc-hdl %x (usr-hdl %x)\n",
|
||
|
@@ -326,7 +329,10 @@ static unsigned int vmcs_sm_usr_handle_f
|
||
|
/* Lookup the resource. */
|
||
|
if (!list_empty(&sm_state->map_list)) {
|
||
|
list_for_each_entry(map, &sm_state->map_list, map_list) {
|
||
|
- if (map->res_pid != pid || map->res_addr != addr)
|
||
|
+ if (map->res_pid != pid)
|
||
|
+ continue;
|
||
|
+ if (!(map->res_addr <= addr &&
|
||
|
+ addr < map->res_addr + map->resource->res_size))
|
||
|
continue;
|
||
|
|
||
|
pr_debug("[%s]: global map %p (pid %u, addr %lx) -> usr-hdl %x (vc-hdl %x)\n",
|