Changeset 46078


Ignore:
Timestamp:
2015-06-20T23:12:01+02:00 (3 years ago)
Author:
rmilecki
Message:

otrx: optimize memory usage by function checking TRX CRC

Allocating huge buffer for the whole TRX wasn't too optimal.

Signed-off-by: Rafał Miłecki <zajec5@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/utils/otrx/src/otrx.c

    r46077 r46078  
    4444size_t trx_offset = 0; 
    4545char *partition[TRX_MAX_PARTS] = {}; 
     46 
     47static inline size_t otrx_min(size_t x, size_t y) { 
     48        return x < y ? x : y; 
     49} 
    4650 
    4751/************************************************** 
     
    148152        struct trx_header hdr; 
    149153        size_t bytes, length; 
    150         uint8_t *buf; 
     154        uint8_t buf[1024]; 
    151155        uint32_t crc32; 
     156        int i; 
    152157        int err = 0; 
    153158 
     
    190195        } 
    191196 
    192         buf = malloc(length); 
    193         if (!buf) { 
    194                 fprintf(stderr, "Couldn't alloc %zd B buffer\n", length); 
    195                 err =  -ENOMEM; 
    196                 goto err_close; 
    197         } 
    198  
    199         fseek(trx, trx_offset, SEEK_SET); 
    200         bytes = fread(buf, 1, length, trx); 
    201         if (bytes != length) { 
    202                 fprintf(stderr, "Couldn't read %zd B of data from %s\n", length, trx_path); 
    203                 err =  -ENOMEM; 
    204                 goto err_free_buf; 
    205         } 
    206  
    207         crc32 = otrx_crc32(buf + TRX_FLAGS_OFFSET, length - TRX_FLAGS_OFFSET); 
     197        crc32 = 0xffffffff; 
     198        fseek(trx, trx_offset + TRX_FLAGS_OFFSET, SEEK_SET); 
     199        length -= TRX_FLAGS_OFFSET; 
     200        while ((bytes = fread(buf, 1, otrx_min(sizeof(buf), length), trx)) > 0) { 
     201                for (i = 0; i < bytes; i++) 
     202                        crc32 = crc32_tbl[(crc32 ^ buf[i]) & 0xff] ^ (crc32 >> 8); 
     203                length -= bytes; 
     204        } 
     205 
     206        if (length) { 
     207                fprintf(stderr, "Couldn't read last %zd B of data from %s\n", length, trx_path); 
     208                err = -EIO; 
     209                goto err_close; 
     210        } 
     211 
    208212        if (crc32 != le32_to_cpu(hdr.crc32)) { 
    209213                fprintf(stderr, "Invalid data crc32: 0x%08x instead of 0x%08x\n", crc32, le32_to_cpu(hdr.crc32)); 
    210214                err =  -EINVAL; 
    211                 goto err_free_buf; 
     215                goto err_close; 
    212216        } 
    213217 
    214218        printf("Found a valid TRX version %d\n", le32_to_cpu(hdr.version)); 
    215219 
    216 err_free_buf: 
    217         free(buf); 
    218220err_close: 
    219221        fclose(trx); 
Note: See TracChangeset for help on using the changeset viewer.