| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include "secbuf.h" |
| #include "utility.h" |
| #include "sysutil.h" |
| #include "sysdeputil.h" |
| |
| void |
| vsf_secbuf_alloc(char** p_ptr, unsigned int size) |
| { |
| unsigned int page_offset; |
| unsigned int round_up; |
| char* p_mmap; |
| char* p_no_access_page; |
| unsigned int page_size = vsf_sysutil_getpagesize(); |
| |
| |
| vsf_secbuf_free(p_ptr); |
| |
| page_offset = size % page_size; |
| if (page_offset) |
| { |
| unsigned int num_pages = size / page_size; |
| num_pages++; |
| round_up = num_pages * page_size; |
| } |
| else |
| { |
| |
| round_up = size; |
| } |
| |
| round_up += page_size * 2; |
| |
| p_mmap = vsf_sysutil_map_anon_pages(round_up); |
| |
| p_no_access_page = p_mmap + round_up - page_size; |
| vsf_sysutil_memprotect(p_no_access_page, page_size, kVSFSysUtilMapProtNone); |
| |
| |
| |
| |
| *((unsigned int*)p_mmap) = round_up; |
| p_no_access_page = p_mmap; |
| vsf_sysutil_memprotect(p_no_access_page, page_size, kVSFSysUtilMapProtNone); |
| |
| p_mmap += page_size; |
| if (page_offset) |
| { |
| p_mmap += (page_size - page_offset); |
| } |
| *p_ptr = p_mmap; |
| } |
| |
| void |
| vsf_secbuf_free(char** p_ptr) |
| { |
| unsigned int map_size; |
| unsigned long page_offset; |
| char* p_mmap = *p_ptr; |
| unsigned int page_size = vsf_sysutil_getpagesize(); |
| if (p_mmap == 0) |
| { |
| return; |
| } |
| |
| page_offset = (unsigned long) p_mmap % page_size; |
| if (page_offset) |
| { |
| p_mmap -= page_offset; |
| } |
| p_mmap -= page_size; |
| |
| vsf_sysutil_memprotect(p_mmap, page_size, kVSFSysUtilMapProtReadOnly); |
| |
| map_size = *((unsigned int*)p_mmap); |
| |
| vsf_sysutil_memunmap(p_mmap, map_size); |
| } |
| |