Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 552efe3 in mainline


Ignore:
Timestamp:
2012-02-24T22:52:50Z (10 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master
Children:
3467821
Parents:
89a0a827
Message:

mkexfat: Fix memory access bug in the upcase_table_write() function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/mkexfat/mkexfat.c

    r89a0a827 r552efe3  
    7777/** Index of the first free cluster on the device */
    7878#define FIRST_FREE_CLUSTER   2
     79
     80#define min(x, y) ((x) < (y) ? (x) : (y))
    7981
    8082typedef struct exfat_cfg {
     
    474476upcase_table_write(service_id_t service_id, exfat_cfg_t *cfg)
    475477{
    476         int rc;
     478        int rc = EOK;
    477479        aoff64_t start_sec, nsecs, i;
    478480        uint8_t *table_ptr;
     481        uint8_t *buf;
     482        size_t table_size = sizeof(upcase_table);
     483
     484        buf = malloc(cfg->sector_size);
     485        if (!buf)
     486                return ENOENT;
    479487
    480488        start_sec = cfg->data_start_sector;
    481         start_sec += (cfg->upcase_table_cluster * cfg->cluster_size) /
     489        start_sec += ((cfg->upcase_table_cluster - 2) * cfg->cluster_size) /
    482490            cfg->sector_size;
    483491
     
    485493        table_ptr = (uint8_t *) upcase_table;
    486494
    487         for (i = 0; i < nsecs; ++i, table_ptr += cfg->sector_size) {
     495        for (i = 0; i < nsecs; ++i,
     496            table_ptr += min(table_size, cfg->sector_size),
     497            table_size -= cfg->sector_size) {
     498
     499                if (table_size < cfg->sector_size)
     500                        memset(buf, 0, cfg->sector_size);
     501                memcpy(buf, table_ptr, min(table_size, cfg->sector_size));
     502
    488503                rc = block_write_direct(service_id,
    489                     start_sec + i, 1, table_ptr);
     504                    start_sec + i, 1, buf);
    490505                if (rc != EOK)
    491                         return rc;
    492         }
    493 
    494         return EOK;
     506                        break;
     507        }
     508
     509        free(buf);
     510        return rc;
    495511}
    496512
Note: See TracChangeset for help on using the changeset viewer.