pstore/ram: Set freed addresses to NULL
authorKees Cook <keescook@chromium.org>
Tue, 11 Oct 2022 20:01:11 +0000 (13:01 -0700)
committerKees Cook <keescook@chromium.org>
Wed, 19 Oct 2022 16:25:39 +0000 (09:25 -0700)
For good measure, set all the freed addresses to NULL when managing
przs.

Cc: Anton Vorontsov <anton@enomsg.org>
Cc: Colin Cross <ccross@android.com>
Cc: Tony Luck <tony.luck@intel.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-and-tested-by: Guilherme G. Piccoli <gpiccoli@igalia.com>
Link: https://lore.kernel.org/r/20221011200112.731334-5-keescook@chromium.org
fs/pstore/ram.c
fs/pstore/ram_core.c
fs/pstore/ram_internal.h

index f5bf360..5a39fa8 100644 (file)
@@ -453,25 +453,27 @@ static void ramoops_free_przs(struct ramoops_context *cxt)
        int i;
 
        /* Free pmsg PRZ */
-       persistent_ram_free(cxt->mprz);
+       persistent_ram_free(&cxt->mprz);
 
        /* Free console PRZ */
-       persistent_ram_free(cxt->cprz);
+       persistent_ram_free(&cxt->cprz);
 
        /* Free dump PRZs */
        if (cxt->dprzs) {
                for (i = 0; i < cxt->max_dump_cnt; i++)
-                       persistent_ram_free(cxt->dprzs[i]);
+                       persistent_ram_free(&cxt->dprzs[i]);
 
                kfree(cxt->dprzs);
+               cxt->dprzs = NULL;
                cxt->max_dump_cnt = 0;
        }
 
        /* Free ftrace PRZs */
        if (cxt->fprzs) {
                for (i = 0; i < cxt->max_ftrace_cnt; i++)
-                       persistent_ram_free(cxt->fprzs[i]);
+                       persistent_ram_free(&cxt->fprzs[i]);
                kfree(cxt->fprzs);
+               cxt->fprzs = NULL;
                cxt->max_ftrace_cnt = 0;
        }
 }
@@ -555,9 +557,10 @@ static int ramoops_init_przs(const char *name,
 
                        while (i > 0) {
                                i--;
-                               persistent_ram_free(prz_ar[i]);
+                               persistent_ram_free(&prz_ar[i]);
                        }
                        kfree(prz_ar);
+                       prz_ar = NULL;
                        goto fail;
                }
                *paddr += zone_sz;
index 9e1047f..97dde52 100644 (file)
@@ -544,8 +544,14 @@ static int persistent_ram_post_init(struct persistent_ram_zone *prz, u32 sig,
        return 0;
 }
 
-void persistent_ram_free(struct persistent_ram_zone *prz)
+void persistent_ram_free(struct persistent_ram_zone **_prz)
 {
+       struct persistent_ram_zone *prz;
+
+       if (!_prz)
+               return;
+
+       prz = *_prz;
        if (!prz)
                return;
 
@@ -569,6 +575,7 @@ void persistent_ram_free(struct persistent_ram_zone *prz)
        persistent_ram_free_old(prz);
        kfree(prz->label);
        kfree(prz);
+       *_prz = NULL;
 }
 
 struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
@@ -605,6 +612,6 @@ struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
 
        return prz;
 err:
-       persistent_ram_free(prz);
+       persistent_ram_free(&prz);
        return ERR_PTR(ret);
 }
index 440ee7a..5f69469 100644 (file)
@@ -82,7 +82,7 @@ struct persistent_ram_zone {
 struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
                        u32 sig, struct persistent_ram_ecc_info *ecc_info,
                        unsigned int memtype, u32 flags, char *label);
-void persistent_ram_free(struct persistent_ram_zone *prz);
+void persistent_ram_free(struct persistent_ram_zone **_prz);
 void persistent_ram_zap(struct persistent_ram_zone *prz);
 
 int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,