Added consistency checks of index root
The index root must lie within the space allocated for it.edge.strict_endians^2
							parent
							
								
									00a5478625
								
							
						
					
					
						commit
						3f3b771cb0
					
				|  | @ -293,6 +293,16 @@ u64 ntfs_inode_lookup_by_name(ntfs_inode *dir_ni, | |||
| 				(unsigned)index_block_size); | ||||
| 		goto put_err_out; | ||||
| 	} | ||||
| 	if (((offsetof(INDEX_ROOT,index) | ||||
| 			+ le32_to_cpu(ir->index.allocated_size)) | ||||
| 			> le32_to_cpu(ctx->attr->value_length)) | ||||
| 	    || (le32_to_cpu(ir->index.entries_offset) | ||||
| 			> le32_to_cpu(ir->index.index_length)) | ||||
| 	    || (le32_to_cpu(ir->index.index_length) | ||||
| 			> le32_to_cpu(ir->index.allocated_size))) { | ||||
| 		ntfs_log_error("Index root is corrupt.\n"); | ||||
| 		goto put_err_out; | ||||
| 	} | ||||
| 	index_end = (u8*)&ir->index + le32_to_cpu(ir->index.index_length); | ||||
| 	/* The first index entry. */ | ||||
| 	ie = (INDEX_ENTRY*)((u8*)&ir->index + | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
|  * Copyright (c) 2004-2005 Richard Russon | ||||
|  * Copyright (c) 2005-2006 Yura Pakhuchiy | ||||
|  * Copyright (c) 2005-2008 Szabolcs Szakacsits | ||||
|  * Copyright (c) 2007-2020 Jean-Pierre Andre | ||||
|  * Copyright (c) 2007-2021 Jean-Pierre Andre | ||||
|  * | ||||
|  * This program/include file is free software; you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU General Public License as published | ||||
|  | @ -673,6 +673,7 @@ int ntfs_index_lookup(const void *key, const int key_len, ntfs_index_context *ic | |||
| 	INDEX_ROOT *ir; | ||||
| 	INDEX_ENTRY *ie; | ||||
| 	INDEX_BLOCK *ib = NULL; | ||||
| 	ATTR_RECORD *a; | ||||
| 	int ret, err = 0; | ||||
| 
 | ||||
| 	ntfs_log_trace("Entering\n"); | ||||
|  | @ -712,10 +713,17 @@ int ntfs_index_lookup(const void *key, const int key_len, ntfs_index_context *ic | |||
| 	} | ||||
| 	 | ||||
| 	old_vcn = VCN_INDEX_ROOT_PARENT; | ||||
| 	/* 
 | ||||
| 	 * FIXME: check for both ir and ib that the first index entry is | ||||
| 	 * within the index block. | ||||
| 	 */ | ||||
| 	a = icx->actx->attr; | ||||
| 	if (((offsetof(INDEX_ROOT,index) | ||||
| 			+ le32_to_cpu(ir->index.index_length)) | ||||
| 			> le32_to_cpu(a->value_length)) | ||||
| 	    || (le32_to_cpu(ir->index.entries_offset) | ||||
| 			> le32_to_cpu(ir->index.index_length))) { | ||||
| 		ntfs_log_error("Index root is corrupt in MFT record %lld.\n", | ||||
| 				(long long)icx->ni->mft_no); | ||||
| 		err = errno = ERANGE; | ||||
| 		goto err_lookup; | ||||
| 	} | ||||
| 	ret = ntfs_ie_lookup(key, key_len, icx, &ir->index, &vcn, &ie); | ||||
| 	if (ret == STATUS_ERROR) { | ||||
| 		err = errno; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue