Author: rmilecki
Date: 2015-06-21 22:04:48 +0200 (Sun, 21 Jun 2015)
New Revision: 46093

Modified:
   branches/chaos_calmer/package/utils/otrx/src/otrx.c
Log:
otrx: optimize memory usage by function checking TRX CRC

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

Signed-off-by: Rafa?\197?\130 Mi?\197?\130ecki <[email protected]>

Backport of r46078

Modified: branches/chaos_calmer/package/utils/otrx/src/otrx.c
===================================================================
--- branches/chaos_calmer/package/utils/otrx/src/otrx.c 2015-06-21 20:04:42 UTC 
(rev 46092)
+++ branches/chaos_calmer/package/utils/otrx/src/otrx.c 2015-06-21 20:04:48 UTC 
(rev 46093)
@@ -44,6 +44,10 @@
 size_t trx_offset = 0;
 char *partition[TRX_MAX_PARTS] = {};
 
+static inline size_t otrx_min(size_t x, size_t y) {
+       return x < y ? x : y;
+}
+
 /**************************************************
  * CRC32
  **************************************************/
@@ -147,8 +151,9 @@
        FILE *trx;
        struct trx_header hdr;
        size_t bytes, length;
-       uint8_t *buf;
+       uint8_t buf[1024];
        uint32_t crc32;
+       int i;
        int err = 0;
 
        if (argc < 3) {
@@ -189,32 +194,29 @@
                goto err_close;
        }
 
-       buf = malloc(length);
-       if (!buf) {
-               fprintf(stderr, "Couldn't alloc %zd B buffer\n", length);
-               err =  -ENOMEM;
-               goto err_close;
+       crc32 = 0xffffffff;
+       fseek(trx, trx_offset + TRX_FLAGS_OFFSET, SEEK_SET);
+       length -= TRX_FLAGS_OFFSET;
+       while ((bytes = fread(buf, 1, otrx_min(sizeof(buf), length), trx)) > 0) 
{
+               for (i = 0; i < bytes; i++)
+                       crc32 = crc32_tbl[(crc32 ^ buf[i]) & 0xff] ^ (crc32 >> 
8);
+               length -= bytes;
        }
 
-       fseek(trx, trx_offset, SEEK_SET);
-       bytes = fread(buf, 1, length, trx);
-       if (bytes != length) {
-               fprintf(stderr, "Couldn't read %zd B of data from %s\n", 
length, trx_path);
-               err =  -ENOMEM;
-               goto err_free_buf;
+       if (length) {
+               fprintf(stderr, "Couldn't read last %zd B of data from %s\n", 
length, trx_path);
+               err = -EIO;
+               goto err_close;
        }
 
-       crc32 = otrx_crc32(buf + TRX_FLAGS_OFFSET, length - TRX_FLAGS_OFFSET);
        if (crc32 != le32_to_cpu(hdr.crc32)) {
                fprintf(stderr, "Invalid data crc32: 0x%08x instead of 
0x%08x\n", crc32, le32_to_cpu(hdr.crc32));
                err =  -EINVAL;
-               goto err_free_buf;
+               goto err_close;
        }
 
        printf("Found a valid TRX version %d\n", le32_to_cpu(hdr.version));
 
-err_free_buf:
-       free(buf);
 err_close:
        fclose(trx);
 out:
_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to