* mmap.cc: Make debug output more consistently. Fix some comments.
(gen_protect): Convert to inline function. (gen_access): Ditto. (mmap_record::gen_protect): Add create parameter as in global function. (mmap_record::alloc_page_map): Change condition so that always the correct protection setting is set after mapping has been established. (mmap64): For anonymous mappings set offset always to 0. (fixup_mmaps_after_fork): Always call fixup_mmap_after_fork method with the MAP_FIXED flag set.
This commit is contained in:
		| @@ -1,3 +1,15 @@ | ||||
| 2005-12-01  Corinna Vinschen  <corinna@vinschen.de> | ||||
|  | ||||
| 	* mmap.cc: Make debug output more consistently.  Fix some comments. | ||||
| 	(gen_protect): Convert to inline function. | ||||
| 	(gen_access): Ditto. | ||||
| 	(mmap_record::gen_protect): Add create parameter as in global function. | ||||
| 	(mmap_record::alloc_page_map): Change condition so that always the | ||||
| 	correct protection setting is set after mapping has been established. | ||||
| 	(mmap64): For anonymous mappings set offset always to 0. | ||||
| 	(fixup_mmaps_after_fork): Always call fixup_mmap_after_fork method | ||||
| 	with the MAP_FIXED flag set. | ||||
|  | ||||
| 2005-12-01  Christopher Faylor  <cgf@timesys.com> | ||||
|  | ||||
| 	* devices.h (_minor): Coerce argument to proper type before | ||||
|   | ||||
| @@ -68,7 +68,7 @@ autogrow (int flags) | ||||
| } | ||||
|  | ||||
| /* Generate Windows protection flags from mmap prot and flag values. */ | ||||
| static DWORD | ||||
| static inline DWORD | ||||
| gen_protect (int prot, int flags, bool create = false) | ||||
| { | ||||
|   DWORD ret = PAGE_NOACCESS; | ||||
| @@ -99,7 +99,7 @@ gen_protect (int prot, int flags, bool create = false) | ||||
| /* Generate Windows access flags from mmap prot and flag values. | ||||
|    Only used on 9x.  PROT_EXEC not supported here since it's not | ||||
|    necessary. */ | ||||
| static DWORD | ||||
| static inline DWORD | ||||
| gen_access (int prot, int flags) | ||||
| { | ||||
|   DWORD ret = 0; | ||||
| @@ -302,7 +302,7 @@ MapViewNT (HANDLE h, void *addr, size_t len, int prot, int flags, _off64_t off) | ||||
|      try again with NULL address. */ | ||||
|   ret = NtMapViewOfSection (h, GetCurrentProcess (), &base, 0, size, &offset, | ||||
| 			    &size, ViewShare, 0, protect); | ||||
|   if (!NT_SUCCESS (ret) && addr  && !fixed (flags)) | ||||
|   if (!NT_SUCCESS (ret) && addr && !fixed (flags)) | ||||
|     { | ||||
|       base = NULL; | ||||
|       ret = NtMapViewOfSection (h, GetCurrentProcess (), &base, 0, size, | ||||
| @@ -313,8 +313,8 @@ MapViewNT (HANDLE h, void *addr, size_t len, int prot, int flags, _off64_t off) | ||||
|       base = NULL; | ||||
|       SetLastError (RtlNtStatusToDosError (ret)); | ||||
|     } | ||||
|   debug_printf ("%x = NtMapViewOfSection (h:%x, addr:%x 0, len:%u, off:%D, " | ||||
| 		"protect:%x,)", base, h, addr, len, off, protect); | ||||
|   debug_printf ("%x = NtMapViewOfSection (h:%x, addr:%x, len:%u, off:%D, " | ||||
| 		"protect:%x, type:%x)", base, h, addr, len, off, protect, 0); | ||||
|   return base; | ||||
| } | ||||
|  | ||||
| @@ -425,8 +425,8 @@ class mmap_record | ||||
|     fhandler_base *alloc_fh (); | ||||
|     void free_fh (fhandler_base *fh); | ||||
|      | ||||
|     DWORD gen_protect () const | ||||
|       { return ::gen_protect (get_prot (), get_flags ()); } | ||||
|     DWORD gen_protect (bool create = false) const | ||||
|       { return ::gen_protect (get_prot (), get_flags (), create); } | ||||
|     DWORD gen_access () const | ||||
|       { return ::gen_access (get_prot (), get_flags ()); } | ||||
|     bool compatible_flags (int fl) const; | ||||
| @@ -469,8 +469,7 @@ class map | ||||
|     void del_list (unsigned i); | ||||
| }; | ||||
|  | ||||
| /* This is the global map structure pointer.  It's allocated once on the | ||||
|    first call to mmap64(). */ | ||||
| /* This is the global map structure pointer. */ | ||||
| static map mmapped_areas; | ||||
|  | ||||
| bool | ||||
| @@ -510,14 +509,16 @@ mmap_record::alloc_page_map () | ||||
| 				      sizeof (DWORD)))) | ||||
|     return false; | ||||
|  | ||||
|   DWORD old_prot; | ||||
|   DWORD start_protect = gen_protect (true); | ||||
|   DWORD real_protect = gen_protect (); | ||||
|   if (real_protect != start_protect | ||||
|       && !VirtualProtect (get_address (), get_len (), | ||||
| 			  real_protect, &start_protect)) | ||||
|     system_printf ("Warning: VirtualProtect (addr: %p, len: 0x%x, " | ||||
| 		   "new_prot: 0x%x, old_prot: 0x%x), %E", | ||||
| 		   get_address (), get_len (), | ||||
| 		   real_protect, start_protect); | ||||
|   DWORD len = PAGE_CNT (get_len ()); | ||||
|   DWORD protect = gen_protect (); | ||||
|   if (protect != PAGE_WRITECOPY && priv () && !anonymous () | ||||
|       && !VirtualProtect (get_address (), len * getpagesize (), | ||||
|       			  protect, &old_prot)) | ||||
|     syscall_printf ("VirtualProtect(%x,%D,%d) failed, %E", | ||||
| 		    get_address (), len * getpagesize ()); | ||||
|   while (len-- > 0) | ||||
|     MAP_SET (len); | ||||
|   return true; | ||||
| @@ -586,10 +587,10 @@ mmap_record::unmap_pages (caddr_t addr, DWORD len) | ||||
|   if (anonymous () && priv () && noreserve () | ||||
|       && !VirtualFree (get_address () + off * getpagesize (), | ||||
| 		       len * getpagesize (), MEM_DECOMMIT)) | ||||
|     syscall_printf ("VirtualFree in unmap_pages () failed, %E"); | ||||
|     debug_printf ("VirtualFree in unmap_pages () failed, %E"); | ||||
|   else if (!VirtualProtect (get_address () + off * getpagesize (), | ||||
| 			    len * getpagesize (), PAGE_NOACCESS, &old_prot)) | ||||
|     syscall_printf ("VirtualProtect in unmap_pages () failed, %E"); | ||||
|     debug_printf ("VirtualProtect in unmap_pages () failed, %E"); | ||||
|  | ||||
|   for (; len-- > 0; ++off) | ||||
|     MAP_CLR (off); | ||||
| @@ -890,6 +891,7 @@ mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off) | ||||
|       /* Anonymous mappings are always forced to pagesize length. */ | ||||
|       len = PAGE_CNT (len) * pagesize; | ||||
|       flags |= MAP_ANONYMOUS; | ||||
|       off = 0; | ||||
|     } | ||||
|   else if (fh->get_device () == FH_FS) | ||||
|     { | ||||
| @@ -1389,7 +1391,7 @@ fhandler_dev_zero::mmap (caddr_t *addr, size_t len, int prot, | ||||
| 	    { | ||||
| 	      VirtualFree (base, len, MEM_RELEASE); | ||||
| 	      set_errno (EINVAL); | ||||
| 	      syscall_printf ("VirtualAlloc: address shift with MAP_FIXED given"); | ||||
| 	      debug_printf ("VirtualAlloc: address shift with MAP_FIXED given"); | ||||
| 	    } | ||||
| 	  return INVALID_HANDLE_VALUE; | ||||
| 	} | ||||
| @@ -1402,7 +1404,7 @@ fhandler_dev_zero::mmap (caddr_t *addr, size_t len, int prot, | ||||
|       if (!h) | ||||
| 	{ | ||||
| 	  __seterrno (); | ||||
| 	  syscall_printf ("CreateMapping failed with %E"); | ||||
| 	  debug_printf ("CreateMapping failed with %E"); | ||||
| 	  return INVALID_HANDLE_VALUE; | ||||
| 	} | ||||
|  | ||||
| @@ -1415,12 +1417,11 @@ fhandler_dev_zero::mmap (caddr_t *addr, size_t len, int prot, | ||||
| 	    { | ||||
| 	      UnmapViewOfFile (base); | ||||
| 	      set_errno (EINVAL); | ||||
| 	      syscall_printf ("MapView: address shift with MAP_FIXED given"); | ||||
| 	      debug_printf ("MapView: address shift with MAP_FIXED given"); | ||||
| 	    } | ||||
| 	  CloseHandle (h); | ||||
| 	  return INVALID_HANDLE_VALUE; | ||||
| 	} | ||||
|  | ||||
|     } | ||||
|   *addr = (caddr_t) base; | ||||
|   return h; | ||||
| @@ -1460,9 +1461,9 @@ fhandler_dev_zero::fixup_mmap_after_fork (HANDLE h, int prot, int flags, | ||||
|     { | ||||
|       MEMORY_BASIC_INFORMATION m; | ||||
|       VirtualQuery (address, &m, sizeof (m)); | ||||
|       system_printf ("requested %p != %p mem alloc base %p, state %p, " | ||||
| 		     "size %d, %E", address, base, m.AllocationBase, m.State, | ||||
| 		     m.RegionSize); | ||||
|       debug_printf ("requested %p != %p mem alloc base %p, state %p, " | ||||
| 		    "size %d, %E", address, base, m.AllocationBase, m.State, | ||||
| 		    m.RegionSize); | ||||
|     } | ||||
|   return base == address; | ||||
| } | ||||
| @@ -1477,7 +1478,7 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, int prot, | ||||
|   if (!h) | ||||
|     { | ||||
|       __seterrno (); | ||||
|       syscall_printf ("CreateMapping failed with %E"); | ||||
|       debug_printf ("CreateMapping failed with %E"); | ||||
|       return INVALID_HANDLE_VALUE; | ||||
|     } | ||||
|  | ||||
| @@ -1490,7 +1491,7 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, int prot, | ||||
| 	{ | ||||
| 	  UnmapViewOfFile (base); | ||||
| 	  set_errno (EINVAL); | ||||
| 	  syscall_printf ("MapView: address shift with MAP_FIXED given"); | ||||
| 	  debug_printf ("MapView: address shift with MAP_FIXED given"); | ||||
| 	} | ||||
|       CloseHandle (h); | ||||
|       return INVALID_HANDLE_VALUE; | ||||
| @@ -1546,7 +1547,7 @@ fhandler_dev_mem::mmap (caddr_t *addr, size_t len, int prot, | ||||
|       || off + len >= mem_size) | ||||
|     { | ||||
|       set_errno (EINVAL); | ||||
|       syscall_printf ("-1 = mmap(): illegal parameter, set EINVAL"); | ||||
|       debug_printf ("-1 = mmap(): illegal parameter, set EINVAL"); | ||||
|       return INVALID_HANDLE_VALUE; | ||||
|     } | ||||
|  | ||||
| @@ -1573,7 +1574,7 @@ fhandler_dev_mem::mmap (caddr_t *addr, size_t len, int prot, | ||||
|   if (!NT_SUCCESS (ret)) | ||||
|     { | ||||
|       __seterrno_from_nt_status (ret); | ||||
|       syscall_printf ("-1 = mmap(): NtOpenSection failed with %E"); | ||||
|       debug_printf ("-1 = mmap(): NtOpenSection failed with %E"); | ||||
|       return INVALID_HANDLE_VALUE; | ||||
|     } | ||||
|  | ||||
| @@ -1586,7 +1587,7 @@ fhandler_dev_mem::mmap (caddr_t *addr, size_t len, int prot, | ||||
|         { | ||||
| 	  NtUnmapViewOfSection (GetCurrentProcess (), base); | ||||
| 	  set_errno (EINVAL); | ||||
| 	  syscall_printf ("MapView: address shift with MAP_FIXED given"); | ||||
| 	  debug_printf ("MapView: address shift with MAP_FIXED given"); | ||||
| 	} | ||||
|       CloseHandle (h); | ||||
|       return INVALID_HANDLE_VALUE; | ||||
| @@ -1620,7 +1621,8 @@ fhandler_dev_mem::fixup_mmap_after_fork (HANDLE h, int prot, int flags, | ||||
| 					 _off64_t offset, DWORD size, | ||||
| 					 void *address) | ||||
| { | ||||
|   void *base = MapViewNT (h, address, size, prot, flags | MAP_ANONYMOUS, offset); | ||||
|   void *base = MapViewNT (h, address, size, prot, | ||||
| 			  flags | MAP_ANONYMOUS, offset); | ||||
|   if (base != address) | ||||
|     { | ||||
|       MEMORY_BASIC_INFORMATION m; | ||||
| @@ -1652,15 +1654,16 @@ fixup_mmaps_after_fork (HANDLE parent) | ||||
| 	   (rec = map_list->get_record (record_idx)); | ||||
| 	   ++record_idx) | ||||
| 	{ | ||||
| 	  debug_printf ("fd %d, h %x, access %x, offset %D, size %u, " | ||||
| 	  		"address %p", rec->get_fd (), rec->get_handle (), | ||||
| 			rec->gen_access (), rec->get_offset (), | ||||
| 			rec->get_len (), rec->get_address ()); | ||||
| 	  debug_printf ("fd %d, h 0x%x, address %p, len 0x%x, prot: 0x%x, " | ||||
| 			"flags: 0x%x, offset %X", | ||||
| 			rec->get_fd (), rec->get_handle (), rec->get_address (), | ||||
| 			rec->get_len (), rec->get_prot (), rec->get_flags (), | ||||
| 			rec->get_offset ()); | ||||
|  | ||||
| 	  fhandler_base *fh = rec->alloc_fh (); | ||||
| 	  bool ret = fh->fixup_mmap_after_fork (rec->get_handle (), | ||||
| 						rec->get_prot (), | ||||
| 						rec->get_flags (), | ||||
| 						rec->get_flags () | MAP_FIXED, | ||||
| 						rec->get_offset (), | ||||
| 						rec->get_len (), | ||||
| 						rec->get_address ()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user