pstore: Avoid potential infinite loop
authorKees Cook <keescook@chromium.org>
Tue, 16 May 2017 19:03:31 +0000 (12:03 -0700)
committerKees Cook <keescook@chromium.org>
Wed, 31 May 2017 17:13:42 +0000 (10:13 -0700)
If a backend does not correctly iterate through its records, pstore will
get stuck loading entries. Detect this with a large record count, and
announce if we ever hit the limit. This will let future backend reading
bugs less annoying to debug. Additionally adjust the error about
pstore_mkfile() failing.

Signed-off-by: Kees Cook <keescook@chromium.org>
fs/pstore/platform.c

index 4c5cd93684607516c7abbf90b996d110a52071bc..d8289ce00f9940d4b4dd6bfaf9068f7f7d268c78 100644 (file)
@@ -822,6 +822,7 @@ void pstore_get_backend_records(struct pstore_info *psi,
                                struct dentry *root, int quiet)
 {
        int failed = 0;
+       unsigned int stop_loop = 65536;
 
        if (!psi || !root)
                return;
@@ -835,7 +836,7 @@ void pstore_get_backend_records(struct pstore_info *psi,
         * may reallocate record.buf. On success, pstore_mkfile() will keep
         * the record.buf, so free it only on failure.
         */
-       for (;;) {
+       for (; stop_loop; stop_loop--) {
                struct pstore_record *record;
                int rc;
 
@@ -870,8 +871,11 @@ out:
        mutex_unlock(&psi->read_mutex);
 
        if (failed)
-               pr_warn("failed to load %d record(s) from '%s'\n",
+               pr_warn("failed to create %d record(s) from '%s'\n",
                        failed, psi->name);
+       if (!stop_loop)
+               pr_err("looping? Too many records seen from '%s'\n",
+                       psi->name);
 }
 
 static void pstore_dowork(struct work_struct *work)