From: Kees Cook Date: Tue, 16 May 2017 19:03:31 +0000 (-0700) Subject: pstore: Avoid potential infinite loop X-Git-Tag: v4.13-rc1~160^2~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=656de42e83379e5348e3f4236ff1d79353edfb28;p=platform%2Fkernel%2Flinux-exynos.git pstore: Avoid potential infinite loop 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 --- diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 4c5cd93..d8289ce 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -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)