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