diff options
author | Thomas Jarosch <tomj@simonv.com> | 2011-11-11 17:44:56 +0000 |
---|---|---|
committer | Thomas Jarosch <tomj@simonv.com> | 2011-11-11 17:44:56 +0000 |
commit | 158e14a8c696b29ec7fa21da5b1a801c31c473e9 (patch) | |
tree | 608dfad55016e528cffc01214c8ab2e104b44cf9 /bootloader/main-pp.c | |
parent | e5ea0b34186cde4cce5183ffd63a3f1c2eaa7e92 (diff) |
Fix file descriptor leak
Probably not much of an error since it's in the bootloader :)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30965 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/main-pp.c')
-rw-r--r-- | bootloader/main-pp.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c index 03c5aa01b8..78a71cbf96 100644 --- a/bootloader/main-pp.c +++ b/bootloader/main-pp.c @@ -327,7 +327,10 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size) printf("mi4 size: %x", mi4header.mi4size); if ((mi4header.mi4size-MI4_HEADER_SIZE) > buffer_size) + { + close(fd); return EFILE_TOO_BIG; + } /* CRC32 */ printf("CRC32: %x", mi4header.crc32); @@ -342,7 +345,10 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size) lseek(fd, MI4_HEADER_SIZE, SEEK_SET); rc = read(fd, buf, mi4header.mi4size-MI4_HEADER_SIZE); if(rc < (int)mi4header.mi4size-MI4_HEADER_SIZE) + { + close(fd); return EREAD_IMAGE_FAILED; + } /* Check CRC32 to see if we have a valid file */ sum = chksum_crc32 (buf, mi4header.mi4size - MI4_HEADER_SIZE); @@ -350,15 +356,21 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size) printf("Calculated CRC32: %x", sum); if(sum != mi4header.crc32) + { + close(fd); return EBAD_CHKSUM; - + } + if( (mi4header.plaintext + MI4_HEADER_SIZE) != mi4header.mi4size) { /* Load encrypted firmware */ int key_index = tea_find_key(&mi4header, fd); if (key_index < 0) + { + close(fd); return EINVALID_FORMAT; + } /* Plaintext part is already loaded */ buf += mi4header.plaintext; @@ -373,10 +385,12 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size) /* Check decryption was successfull */ if(le2int(&buf[mi4header.length-mi4header.plaintext-4]) != 0xaa55aa55) { + close(fd); return EREAD_IMAGE_FAILED; } } + close(fd); return EOK; } |