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@gmail.com>

SVN-Revision: 46078
This commit is contained in:
Rafał Miłecki 2015-06-20 21:12:01 +00:00
parent c13dede6b1
commit 1e6643ff15

View file

@ -44,6 +44,10 @@ char *trx_path;
size_t trx_offset = 0; size_t trx_offset = 0;
char *partition[TRX_MAX_PARTS] = {}; char *partition[TRX_MAX_PARTS] = {};
static inline size_t otrx_min(size_t x, size_t y) {
return x < y ? x : y;
}
/************************************************** /**************************************************
* CRC32 * CRC32
**************************************************/ **************************************************/
@ -147,8 +151,9 @@ static int otrx_check(int argc, char **argv) {
FILE *trx; FILE *trx;
struct trx_header hdr; struct trx_header hdr;
size_t bytes, length; size_t bytes, length;
uint8_t *buf; uint8_t buf[1024];
uint32_t crc32; uint32_t crc32;
int i;
int err = 0; int err = 0;
if (argc < 3) { if (argc < 3) {
@ -189,32 +194,29 @@ static int otrx_check(int argc, char **argv) {
goto err_close; goto err_close;
} }
buf = malloc(length); crc32 = 0xffffffff;
if (!buf) { fseek(trx, trx_offset + TRX_FLAGS_OFFSET, SEEK_SET);
fprintf(stderr, "Couldn't alloc %zd B buffer\n", length); length -= TRX_FLAGS_OFFSET;
err = -ENOMEM; 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;
}
if (length) {
fprintf(stderr, "Couldn't read last %zd B of data from %s\n", length, trx_path);
err = -EIO;
goto err_close; goto err_close;
} }
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;
}
crc32 = otrx_crc32(buf + TRX_FLAGS_OFFSET, length - TRX_FLAGS_OFFSET);
if (crc32 != le32_to_cpu(hdr.crc32)) { 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)); fprintf(stderr, "Invalid data crc32: 0x%08x instead of 0x%08x\n", crc32, le32_to_cpu(hdr.crc32));
err = -EINVAL; err = -EINVAL;
goto err_free_buf; goto err_close;
} }
printf("Found a valid TRX version %d\n", le32_to_cpu(hdr.version)); printf("Found a valid TRX version %d\n", le32_to_cpu(hdr.version));
err_free_buf:
free(buf);
err_close: err_close:
fclose(trx); fclose(trx);
out: out: