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:
parent
c13dede6b1
commit
1e6643ff15
1 changed files with 19 additions and 17 deletions
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue