Add searching always for chunks after getting global lock
This commit is contained in:
		
							parent
							
								
									8759a57902
								
							
						
					
					
						commit
						c26830a820
					
				| @ -253,14 +253,12 @@ impl VMManager { | |||||||
|                 // Single VMA Chunk could be updated during the release of internal manager lock. Get overlapping chunk again.
 |                 // Single VMA Chunk could be updated during the release of internal manager lock. Get overlapping chunk again.
 | ||||||
|                 // This is done here because we don't want to acquire the big internal manager lock as soon as entering this function.
 |                 // This is done here because we don't want to acquire the big internal manager lock as soon as entering this function.
 | ||||||
|                 let mut internal_manager = self.internal(); |                 let mut internal_manager = self.internal(); | ||||||
|                 let overlapping_chunk = if chunk.range() != vma.lock().unwrap().range() { |                 let overlapping_chunk = { | ||||||
|                     let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); |                     let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); | ||||||
|                     process_mem_chunks |                     process_mem_chunks | ||||||
|                         .iter() |                         .iter() | ||||||
|                         .find(|&chunk| chunk.range().intersect(&munmap_range).is_some()) |                         .find(|&chunk| chunk.range().intersect(&munmap_range).is_some()) | ||||||
|                         .map(|chunk| chunk.clone()) |                         .map(|chunk| chunk.clone()) | ||||||
|                 } else { |  | ||||||
|                     Some(chunk) |  | ||||||
|                 }; |                 }; | ||||||
|                 if let Some(overlapping_chunk) = overlapping_chunk { |                 if let Some(overlapping_chunk) = overlapping_chunk { | ||||||
|                     return internal_manager.munmap_chunk( |                     return internal_manager.munmap_chunk( | ||||||
| @ -320,8 +318,8 @@ impl VMManager { | |||||||
| 
 | 
 | ||||||
|                 // There are rare cases that mutliple threads do mprotect or munmap for the same single-vma chunk
 |                 // There are rare cases that mutliple threads do mprotect or munmap for the same single-vma chunk
 | ||||||
|                 // but for different ranges and the cloned chunk is outdated when acquiring the InternalVMManger lock here.
 |                 // but for different ranges and the cloned chunk is outdated when acquiring the InternalVMManger lock here.
 | ||||||
|                 // In this case, we search for the chunk again.
 |                 //Thus, we search for the chunk again.
 | ||||||
|                 let chunk = if chunk.range() != vma.lock().unwrap().range() { |                 let chunk = { | ||||||
|                     let current = current!(); |                     let current = current!(); | ||||||
|                     let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); |                     let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); | ||||||
|                     let chunk = process_mem_chunks |                     let chunk = process_mem_chunks | ||||||
| @ -331,8 +329,6 @@ impl VMManager { | |||||||
|                         return_errno!(ENOMEM, "invalid mprotect range"); |                         return_errno!(ENOMEM, "invalid mprotect range"); | ||||||
|                     } |                     } | ||||||
|                     chunk.unwrap().clone() |                     chunk.unwrap().clone() | ||||||
|                 } else { |  | ||||||
|                     chunk |  | ||||||
|                 }; |                 }; | ||||||
|                 return internal_manager.mprotect_single_vma_chunk(&chunk, protect_range, perms); |                 return internal_manager.mprotect_single_vma_chunk(&chunk, protect_range, perms); | ||||||
|             } |             } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user