mtd: seama: move buf allocation to the MD5 function
authorRafał Miłecki <zajec5@gmail.com>
Mon, 9 May 2016 12:53:36 +0000 (12:53 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Mon, 9 May 2016 12:53:36 +0000 (12:53 +0000)
This buf is only used in this function now, so lets move it there.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 49308

package/system/mtd/src/seama.c

index b51177ac87d6d849d14467fdaccb08d12543e6b7..dac5da2b8566e39de4c556cc289d68b7f5e7dcbd 100644 (file)
@@ -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)) {