Changes in uspace/lib/ext2/libext2_directory.c [911ee54:18626b3] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext2/libext2_directory.c
r911ee54 r18626b3 40 40 #include <assert.h> 41 41 42 static int ext2_directory_iterator_set(ext2_directory_iterator_t *it,43 uint32_t block_size);44 45 42 /** 46 43 * Get inode number for the directory entry … … 93 90 int rc; 94 91 uint32_t block_id; 95 uint32_t block_size;96 97 92 it->inode_ref = inode_ref; 98 93 it->fs = fs; 99 94 100 / * Get the first data block, so we can get the first entry */95 // Get the first data block, so we can get first entry 101 96 rc = ext2_filesystem_get_inode_data_block_index(fs, inode_ref->inode, 0, 102 97 &block_id); … … 110 105 } 111 106 112 block_size = ext2_superblock_get_block_size(fs->superblock);113 114 it->current_offset = 0;115 return ext2_directory_iterator_set(it, block_size);107 it->current = it->current_block->data; 108 it->current_offset = 0; 109 110 return EOK; 116 111 } 117 112 … … 131 126 uint32_t next_block_phys_idx; 132 127 uint32_t block_size; 128 uint32_t offset_in_block; 133 129 134 130 assert(it->current != NULL); … … 137 133 size = ext2_inode_get_size(it->fs->superblock, it->inode_ref->inode); 138 134 139 / * Are we at the end? */135 // Are we at the end? 140 136 if (it->current_offset + skip >= size) { 141 137 rc = block_put(it->current_block); … … 154 150 next_block_idx = (it->current_offset + skip) / block_size; 155 151 156 /* If we are moving accross block boundary, 157 * we need to get another block 158 */ 152 // If we are moving accross block boundary, 153 // we need to get another block 159 154 if (current_block_idx != next_block_idx) { 160 155 rc = block_put(it->current_block); … … 179 174 } 180 175 176 offset_in_block = (it->current_offset + skip) % block_size; 177 178 // Ensure proper alignment 179 if ((offset_in_block % 4) != 0) { 180 it->current = NULL; 181 return EIO; 182 } 183 184 // Ensure that the core of the entry does not overflow the block 185 if (offset_in_block > block_size - 8) { 186 it->current = NULL; 187 return EIO; 188 } 189 190 it->current = it->current_block->data + offset_in_block; 181 191 it->current_offset += skip; 182 return ext2_directory_iterator_set(it, block_size); 183 } 184 185 static int ext2_directory_iterator_set(ext2_directory_iterator_t *it, 186 uint32_t block_size) 187 { 188 uint32_t offset_in_block = it->current_offset % block_size; 189 190 it->current = NULL; 191 192 /* Ensure proper alignment */ 193 if ((offset_in_block % 4) != 0) { 194 return EIO; 195 } 196 197 /* Ensure that the core of the entry does not overflow the block */ 198 if (offset_in_block > block_size - 8) { 199 return EIO; 200 } 201 202 ext2_directory_entry_ll_t *entry = it->current_block->data + offset_in_block; 203 204 /* Ensure that the whole entry does not overflow the block */ 205 uint16_t length = ext2_directory_entry_ll_get_entry_length(entry); 206 if (offset_in_block + length > block_size) { 207 return EIO; 208 } 209 210 /* Ensure the name length is not too large */ 192 193 // Ensure that the whole entry does not overflow the block 194 skip = ext2_directory_entry_ll_get_entry_length(it->current); 195 if (offset_in_block + skip > block_size) { 196 it->current = NULL; 197 return EIO; 198 } 199 200 // Ensure the name length is not too large 211 201 if (ext2_directory_entry_ll_get_name_length(it->fs->superblock, 212 entry) > length-8) {213 return EIO;214 }215 216 it->current = entry;202 it->current) > skip-8) { 203 it->current = NULL; 204 return EIO; 205 } 206 217 207 return EOK; 218 208 }
Note:
See TracChangeset
for help on using the changeset viewer.