Changeset fde8a27 in mainline for uspace/srv/fs/minixfs/mfs_read.c


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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.