Add the check of pathname in rename syscall
This commit is contained in:
		
							parent
							
								
									1eb58a5eb3
								
							
						
					
					
						commit
						9f763f84b1
					
				
							
								
								
									
										2
									
								
								deps/sefs
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								deps/sefs
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | |||||||
| Subproject commit ca5dabb6ef3d4e9fdd704c40b85098cee8b63c5f | Subproject commit 5fd86adbfa0b173d10d5afebd871a237bf25f688 | ||||||
| @ -8,6 +8,14 @@ pub fn do_renameat(old_fs_path: &FsPath, new_fs_path: &FsPath) -> Result<()> { | |||||||
| 
 | 
 | ||||||
|     let oldpath = old_fs_path.to_abs_path()?; |     let oldpath = old_fs_path.to_abs_path()?; | ||||||
|     let newpath = new_fs_path.to_abs_path()?; |     let newpath = new_fs_path.to_abs_path()?; | ||||||
|  | 
 | ||||||
|  |     let old_path = Path::new(&oldpath); | ||||||
|  |     let new_path = Path::new(&newpath); | ||||||
|  |     // Limitation: only compare the whole path components, cannot handle symlink or ".."
 | ||||||
|  |     if new_path.starts_with(old_path) && new_path != old_path { | ||||||
|  |         return_errno!(EINVAL, "newpath contains a path prefix of the oldpath"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     let current = current!(); |     let current = current!(); | ||||||
|     let fs = current.fs().read().unwrap(); |     let fs = current.fs().read().unwrap(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -178,6 +178,31 @@ static int test_rename_dir() { | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int test_rename_dir_to_subdir() { | ||||||
|  |     const char *old_dir = "/root/test_old_dir"; | ||||||
|  |     mode_t mode = 00775; | ||||||
|  |     int ret; | ||||||
|  | 
 | ||||||
|  |     char sub_dir[PATH_MAX] = { 0 }; | ||||||
|  |     ret = snprintf(sub_dir, sizeof(sub_dir), "%s/test_new_dir", old_dir); | ||||||
|  |     if (ret >= sizeof(sub_dir) || ret < 0) { | ||||||
|  |         THROW_ERROR("failed to init new dir path"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (mkdir(old_dir, mode) < 0) { | ||||||
|  |         THROW_ERROR("failed to mkdir"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ret = rename(old_dir, sub_dir); | ||||||
|  |     if (ret == 0 || errno != EINVAL) { | ||||||
|  |         THROW_ERROR("failed to check rename dir to subdir"); | ||||||
|  |     } | ||||||
|  |     if (rmdir(old_dir) < 0) { | ||||||
|  |         THROW_ERROR("failed to rmdir"); | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ============================================================================
 | // ============================================================================
 | ||||||
| // Test suite main
 | // Test suite main
 | ||||||
| // ============================================================================
 | // ============================================================================
 | ||||||
| @ -188,6 +213,7 @@ static test_case_t test_cases[] = { | |||||||
|     TEST_CASE(test_rename_with_target_exist), |     TEST_CASE(test_rename_with_target_exist), | ||||||
|     TEST_CASE(test_renameat), |     TEST_CASE(test_renameat), | ||||||
|     TEST_CASE(test_rename_dir), |     TEST_CASE(test_rename_dir), | ||||||
|  |     TEST_CASE(test_rename_dir_to_subdir), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int main(int argc, const char *argv[]) { | int main(int argc, const char *argv[]) { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user