btrfs: volumes: Make sure no dev extent is beyond device boundary
Add extra dev extent end check against device boundary. Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									5eb193812a
								
							
						
					
					
						commit
						05a37c4860
					
				| @ -7387,6 +7387,7 @@ static int verify_one_dev_extent(struct btrfs_fs_info *fs_info, | ||||
| 	struct extent_map_tree *em_tree = &fs_info->mapping_tree.map_tree; | ||||
| 	struct extent_map *em; | ||||
| 	struct map_lookup *map; | ||||
| 	struct btrfs_device *dev; | ||||
| 	u64 stripe_len; | ||||
| 	bool found = false; | ||||
| 	int ret = 0; | ||||
| @ -7436,6 +7437,22 @@ static int verify_one_dev_extent(struct btrfs_fs_info *fs_info, | ||||
| 			physical_offset, devid); | ||||
| 		ret = -EUCLEAN; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Make sure no dev extent is beyond device bondary */ | ||||
| 	dev = btrfs_find_device(fs_info, devid, NULL, NULL); | ||||
| 	if (!dev) { | ||||
| 		btrfs_err(fs_info, "failed to find devid %llu", devid); | ||||
| 		ret = -EUCLEAN; | ||||
| 		goto out; | ||||
| 	} | ||||
| 	if (physical_offset + physical_len > dev->disk_total_bytes) { | ||||
| 		btrfs_err(fs_info, | ||||
| "dev extent devid %llu physical offset %llu len %llu is beyond device boundary %llu", | ||||
| 			  devid, physical_offset, physical_len, | ||||
| 			  dev->disk_total_bytes); | ||||
| 		ret = -EUCLEAN; | ||||
| 		goto out; | ||||
| 	} | ||||
| out: | ||||
| 	free_extent_map(em); | ||||
| 	return ret; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user