Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ext2/libext2_directory.c

    r18626b3 r911ee54  
    4040#include <assert.h>
    4141
     42static int ext2_directory_iterator_set(ext2_directory_iterator_t *it,
     43    uint32_t block_size);
     44
    4245/**
    4346 * Get inode number for the directory entry
     
    9093        int rc;
    9194        uint32_t block_id;
     95        uint32_t block_size;
     96       
    9297        it->inode_ref = inode_ref;
    9398        it->fs = fs;
    9499       
    95         // Get the first data block, so we can get first entry
     100        /* Get the first data block, so we can get the first entry */
    96101        rc = ext2_filesystem_get_inode_data_block_index(fs, inode_ref->inode, 0,
    97102            &block_id);
     
    105110        }
    106111       
    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);
    111116}
    112117
     
    126131        uint32_t next_block_phys_idx;
    127132        uint32_t block_size;
    128         uint32_t offset_in_block;
    129133       
    130134        assert(it->current != NULL);
     
    133137        size = ext2_inode_get_size(it->fs->superblock, it->inode_ref->inode);
    134138       
    135         // Are we at the end?
     139        /* Are we at the end? */
    136140        if (it->current_offset + skip >= size) {
    137141                rc = block_put(it->current_block);
     
    150154        next_block_idx = (it->current_offset + skip) / block_size;
    151155       
    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         */
    154159        if (current_block_idx != next_block_idx) {
    155160                rc = block_put(it->current_block);
     
    174179        }
    175180       
    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
     185static 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 */
    179193        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 */
    185198        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 */
    201211        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;
    207217        return EOK;
    208218}
Note: See TracChangeset for help on using the changeset viewer.