Changeset fde8a27 in mainline


Ignore:
Timestamp:
2011-03-28T19:17:31Z (13 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1f1cc9d
Parents:
ef76d72
Message:

Fix bug when reading inodes that causes on-disk structures corruption if the
endianness is not native.

Location:
uspace/srv/fs/minixfs
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/minixfs/mfs.h

    ref76d72 rfde8a27  
    5757
    5858GLOBAL fs_reg_t mfs_reg;
     59
     60typedef enum {
     61        BMAP_ZONE,
     62        BMAP_INODE
     63} bmap_id_t;
    5964
    6065typedef enum {
  • uspace/srv/fs/minixfs/mfs_read.c

    ref76d72 rfde8a27  
    7272static int read_map_ondisk(uint32_t *b, const struct mfs_node *mnode, int rblock)
    7373{
    74         block_t *bi1, *bi2;
    7574        int r, nr_direct;
    7675        int ptrs_per_block;
     76        uint32_t *bi1 = NULL;
     77        uint32_t *bi2 = NULL;
    7778
    7879        assert(mnode);
     
    110111                }
    111112
    112                 r = read_ind_block(bi2, mnode->instance, ino_i->i_izone[0]);
     113                bi1 = (uint32_t *) malloc(sbi->block_size);
     114                r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[0],
     115                                        fs_version);
    113116
    114                 if (r != EOK)
    115                         goto out;
     117                if (fs_version == MFS_VERSION_V1)
     118                        *b = ((uint16_t *) bi1)[rblock];
     119                else
     120                        *b = bi1[rblock];
    116121
    117                 *b = fs_version == MFS_VERSION_V1 ?
    118                                 ((uint16_t *) bi1->data)[rblock] :
    119                                 ((uint32_t *) bi1->data)[rblock];
    120                 goto out_block;
     122                goto out;
    121123        }
    122124
     
    130132                goto out;
    131133        }
    132         r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1]);
     134
     135        bi1 = (uint32_t *) malloc(sbi->block_size);
     136        bi2 = (uint32_t *) malloc(sbi->block_size);
     137
     138        r = read_ind_block(bi1, mnode->instance, ino_i->i_izone[1],
     139                                fs_version);
    133140
    134141        if (r != EOK)
     
    144151        if (fs_version == MFS_VERSION_V1) {
    145152                r = read_ind_block(bi2, mnode->instance,
    146                         ((uint16_t *) bi1->data)[di_block]);
     153                        ((uint16_t *) bi1)[di_block], fs_version);
    147154
    148155                if (r != EOK)
    149                         goto out_block;
     156                        goto out;
    150157
    151                 *b = ((uint16_t *) bi2->data)[rblock % ptrs_per_block];
     158                *b = ((uint16_t *) bi2)[rblock % ptrs_per_block];
    152159        } else {
    153160                r = read_ind_block(bi2, mnode->instance,
    154                         ((uint32_t *) bi1->data)[di_block]);
     161                        ((uint32_t *) bi1)[di_block], fs_version);
    155162
    156163                if (r != EOK)
    157                         goto out_block;
     164                        goto out;
    158165
    159                 *b = ((uint32_t *) bi2->data)[rblock % ptrs_per_block];
     166                *b = bi2[rblock % ptrs_per_block];
    160167        }
    161168        r = EOK;
    162         block_put(bi2);
    163169
    164 out_block:
    165         block_put(bi1);
    166170out:
     171        if (bi1)
     172                free(bi1);
     173        if (bi2)
     174                free(bi2);
    167175        return r;
    168176}
  • uspace/srv/fs/minixfs/mfs_utils.c

    ref76d72 rfde8a27  
    6565 *content to the native endian format.
    6666 */
    67 int read_ind_block(block_t *b, struct mfs_instance *inst, uint32_t block)
     67int
     68read_ind_block(void *data, struct mfs_instance *inst,
     69                        uint32_t block, mfs_version_t version)
    6870{
    6971        int rc;
    7072        unsigned i;
     73        block_t *b;
     74        uint32_t *ptr32;
     75        uint16_t *ptr16;
    7176
    7277        assert(inst);
     
    7984
    8085        if (rc != EOK)
    81                 return rc;
     86                goto out;
    8287
    83         if (sbi->fs_version == MFS_VERSION_V1) {
    84                 uint16_t *pt16 = b->data;
     88        if (version == MFS_VERSION_V1) {
     89                uint16_t *p = b->data;
     90                ptr16 = data;
     91                for (i = 0; i < sbi->block_size / sizeof(uint16_t); ++i)
     92                        ptr16[i] = conv16(sbi->native, p[i]);
     93        } else {
     94                uint32_t *p = b->data;
     95                ptr32 = data;
     96                for (i = 0; i < sbi->block_size / sizeof(uint32_t); ++i)
     97                        ptr32[i] = conv32(sbi->native, p[i]);
    8598
    86                 for (i = 0; i < MFS_BLOCKSIZE / sizeof(uint16_t); ++i)
    87                         pt16[i] = conv16(sbi->native, pt16[i]);
    88         } else {
    89                 uint32_t *pt32 = b->data;
    90 
    91                 for (i = 0; i < sbi->block_size / sizeof(uint32_t); ++i)
    92                         pt32[i] = conv32(sbi->native, pt32[i]);
    9399        }
    94100
    95         return EOK;
     101        rc = EOK;
     102
     103out:
     104        block_put(b);
     105        return rc;
    96106}
    97107
  • uspace/srv/fs/minixfs/mfs_utils.h

    ref76d72 rfde8a27  
    3636#include <sys/types.h>
    3737#include <bool.h>
     38#include "mfs.h"
    3839
    39 uint16_t conv16(bool native, uint16_t n);
    40 uint32_t conv32(bool native, uint32_t n);
    41 uint64_t conv64(bool native, uint64_t n);
    42 int read_ind_block(block_t *b, struct mfs_instance *inst, uint32_t block);
     40extern uint16_t
     41conv16(bool native, uint16_t n);
     42
     43extern uint32_t
     44conv32(bool native, uint32_t n);
     45
     46extern uint64_t
     47conv64(bool native, uint64_t n);
     48
     49extern int
     50read_ind_block(void *data, struct mfs_instance *inst,
     51                uint32_t block, mfs_version_t version);
    4352
    4453#endif
Note: See TracChangeset for help on using the changeset viewer.