aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2016-05-09 12:54:49 +0000
committerLuka Perkov <luka@openwrt.org>2016-06-19 19:56:13 +0200
commitf9e8c4c3ccf15243d860670c22d3b271cd1bcac2 (patch)
tree9ca33a02a4bb488288536ebe28a1a1682b5f5e1e
parent79bd6bc9fb1532382fe38feb4b61323a568b9f23 (diff)
downloadupstream-f9e8c4c3ccf15243d860670c22d3b271cd1bcac2.tar.gz
upstream-f9e8c4c3ccf15243d860670c22d3b271cd1bcac2.tar.bz2
upstream-f9e8c4c3ccf15243d860670c22d3b271cd1bcac2.zip
mtd: seama: move buf allocation to the MD5 function
This buf is only used in this function now, so lets move it there. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Backport of r49308 git-svn-id: svn://svn.openwrt.org/openwrt/branches/chaos_calmer@49312 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--package/system/mtd/src/seama.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/package/system/mtd/src/seama.c b/package/system/mtd/src/seama.c
index b51177ac87..dac5da2b85 100644
--- a/package/system/mtd/src/seama.c
+++ b/package/system/mtd/src/seama.c
@@ -51,18 +51,34 @@ ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
int
-seama_fix_md5(struct seama_entity_header *shdr, char *buf, size_t len)
+seama_fix_md5(struct seama_entity_header *shdr, int fd, size_t len, size_t block_offset)
{
+ char *buf;
char *data;
+ ssize_t res;
size_t msize;
size_t isize;
MD5_CTX ctx;
unsigned char digest[16];
int i;
+ int err = 0;
if (len < sizeof(struct seama_entity_header))
return -1;
+ buf = malloc(len);
+ if (!buf) {
+ err = -ENOMEM;
+ goto err_out;
+ }
+
+ res = pread(fd, buf, len, block_offset);
+ if (res != len) {
+ perror("pread");
+ err = -EIO;
+ goto err_free;
+ }
+
isize = ntohl(shdr->size);
msize = ntohs(shdr->metasize);
if (isize == 0) {
@@ -100,7 +116,10 @@ seama_fix_md5(struct seama_entity_header *shdr, char *buf, size_t len)
/* update the checksum in the image */
memcpy(shdr->md5, digest, sizeof(digest));
- return 0;
+err_free:
+ free(buf);
+err_out:
+ return err;
}
int
@@ -108,7 +127,6 @@ mtd_fixseama(const char *mtd, size_t offset)
{
int fd;
char *first_block;
- char *buf;
ssize_t res;
size_t block_offset;
struct seama_entity_header *shdr;
@@ -150,19 +168,7 @@ mtd_fixseama(const char *mtd, size_t offset)
return -1;
}
- buf = malloc(mtdsize);
- if (!buf) {
- perror("malloc");
- exit(1);
- }
-
- res = pread(fd, buf, mtdsize, block_offset);
- if (res != mtdsize) {
- perror("pread");
- exit(1);
- }
-
- if (seama_fix_md5(shdr, buf, mtdsize))
+ if (seama_fix_md5(shdr, fd, mtdsize, block_offset))
goto out;
if (mtd_erase_block(fd, block_offset)) {