From: Kees Cook <[email protected]>

The read/mkfile pair pass the same arguments and should be cleared
between calls. Move to a structure and wipe it after every loop.

Signed-off-by: Kees Cook <[email protected]>
[[email protected]: ported to Barebox from Linux commit 9abdcccc3d5f]
Signed-off-by: Philipp Zabel <[email protected]>
---
 fs/pstore/platform.c   | 30 +++++++++++++++++-------------
 include/linux/pstore.h | 15 ++++++++++++++-
 2 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 963ecafef8..6eebad63de 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -96,13 +96,8 @@ EXPORT_SYMBOL_GPL(pstore_register);
 void pstore_get_records(int quiet)
 {
        struct pstore_info *psi = psinfo;
-       char                    *buf = NULL;
-       ssize_t                 size;
-       u64                     id;
-       int                     count;
-       enum pstore_type_id     type;
+       struct pstore_record    record = { .psi = psi, };
        int                     failed = 0, rc;
-       bool                    compressed;
        int                     unzipped_len = -1;
 
        if (!psi)
@@ -112,22 +107,31 @@ void pstore_get_records(int quiet)
        if (psi->open && psi->open(psi))
                goto out;
 
-       while ((size = psi->read(&id, &type, &count, &buf, &compressed,
-                               psi)) > 0) {
-               if (compressed && (type == PSTORE_TYPE_DMESG)) {
+       while ((record.size = psi->read(&record.id, &record.type,
+                                       &record.count,
+                                       &record.buf, &record.compressed,
+                                       record.psi)) > 0) {
+               if (record.compressed &&
+                   record.type == PSTORE_TYPE_DMESG) {
                        pr_err("barebox does not have ramoops compression 
support\n");
                        continue;
                }
-               rc = pstore_mkfile(type, psi->name, id, count, buf,
-                                 compressed, (size_t)size, psi);
+               rc = pstore_mkfile(record.type, psi->name, record.id,
+                                  record.count, record.buf,
+                                  record.compressed,
+                                  record.size,
+                                  record.psi);
                if (unzipped_len < 0) {
                        /* Free buffer other than big oops */
-                       kfree(buf);
-                       buf = NULL;
+                       kfree(record.buf);
+                       record.buf = NULL;
                } else
                        unzipped_len = -1;
                if (rc && (rc != -EEXIST || !quiet))
                        failed++;
+
+               memset(&record, 0, sizeof(record));
+               record.psi = psi;
        }
        if (psi->close)
                psi->close(psi);
diff --git a/include/linux/pstore.h b/include/linux/pstore.h
index a925e14397..23f35570aa 100644
--- a/include/linux/pstore.h
+++ b/include/linux/pstore.h
@@ -25,6 +25,8 @@
 #include <linux/types.h>
 #include <asm-generic/errno.h>
 
+struct module;
+
 /* types */
 enum pstore_type_id {
        PSTORE_TYPE_DMESG       = 0,
@@ -43,7 +45,18 @@ enum kmsg_dump_reason {
        KMSG_DUMP_UNDEF,
 };
 
-struct module;
+struct pstore_info;
+
+struct pstore_record {
+       struct pstore_info      *psi;
+       enum pstore_type_id     type;
+       u64                     id;
+       char                    *buf;
+       int                     count;
+       bool                    compressed;
+       ssize_t                 size;
+       ssize_t                 ecc_notice_size;
+};
 
 struct pstore_info {
        struct module   *owner;
-- 
2.11.0


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to