git: 3ac5012e52ee - main - sdhci: Fix crash caused by M_WAITOK in sdhci dumps
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 05 Oct 2021 04:23:20 UTC
The branch main has been updated by wma: URL: https://cgit.FreeBSD.org/src/commit/?id=3ac5012e52ee3d9abf9c18e1302d8c6851858fd2 commit 3ac5012e52ee3d9abf9c18e1302d8c6851858fd2 Author: Bartlomiej Grzesik <bag@semihalf.com> AuthorDate: 2021-10-05 04:22:32 +0000 Commit: Wojciech Macek <wma@FreeBSD.org> CommitDate: 2021-10-05 04:22:32 +0000 sdhci: Fix crash caused by M_WAITOK in sdhci dumps In some contexts it is illegal to wait for memory allocation, causing kernel panic. By default sbuf_new passes M_WAITOK to malloc, which caused crashes when sdhci_dumpcaps or sdhci_dumpregs was callend in non sutiable context. Add SBUF_NOWAIT flag to sbuf_new to fix this. Obtained from: Semihalf Differential revision: https://reviews.freebsd.org/D32075 --- sys/dev/sdhci/sdhci.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sys/dev/sdhci/sdhci.c b/sys/dev/sdhci/sdhci.c index 7806a08a1572..4a59a73a7e26 100644 --- a/sys/dev/sdhci/sdhci.c +++ b/sys/dev/sdhci/sdhci.c @@ -264,7 +264,11 @@ sdhci_dumpregs(struct sdhci_slot *slot) { struct sbuf s; - sbuf_new(&s, NULL, 1024, SBUF_AUTOEXTEND); + if (sbuf_new(&s, NULL, 1024, SBUF_NOWAIT | SBUF_AUTOEXTEND) == NULL) { + slot_printf(slot, "sdhci_dumpregs: Failed to allocate memory for sbuf\n"); + return; + } + sbuf_set_drain(&s, &sbuf_printf_drain, NULL); sdhci_dumpregs_buf(slot, &s); sbuf_finish(&s); @@ -340,7 +344,11 @@ sdhci_dumpcaps(struct sdhci_slot *slot) { struct sbuf s; - sbuf_new(&s, NULL, 1024, SBUF_AUTOEXTEND); + if (sbuf_new(&s, NULL, 1024, SBUF_NOWAIT | SBUF_AUTOEXTEND) == NULL) { + slot_printf(slot, "sdhci_dumpcaps: Failed to allocate memory for sbuf\n"); + return; + } + sbuf_set_drain(&s, &sbuf_printf_drain, NULL); sdhci_dumpcaps_buf(slot, &s); sbuf_finish(&s);