Skip to content

Commit 63f6443

Browse files
krzkgregkh
authored andcommitted
firmware: qcom: scm: Fix missing read barrier in qcom_scm_get_tzmem_pool()
commit b628510 upstream. Commit 2e49551 ("firmware: qcom: scm: Fix __scm and waitq completion variable initialization") introduced a write barrier in probe function to store global '__scm' variable. We all known barriers are paired (see memory-barriers.txt: "Note that write barriers should normally be paired with read or address-dependency barriers"), therefore accessing it from concurrent contexts requires read barrier. Previous commit added such barrier in qcom_scm_is_available(), so let's use that directly. Lack of this read barrier can result in fetching stale '__scm' variable value, NULL, and dereferencing it. Note that barrier in qcom_scm_is_available() satisfies here the control dependency. Fixes: ca61d68 ("firmware: qcom: scm: fix a NULL-pointer dereference") Fixes: 449d0d8 ("firmware: qcom: scm: smc: switch to using the SCM allocator") Cc: stable@vger.kernel.org Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Link: https://lore.kernel.org/r/20241209-qcom-scm-missing-barriers-and-all-sort-of-srap-v2-2-9061013c8d92@linaro.org Signed-off-by: Bjorn Andersson <andersson@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 4dc38d5 commit 63f6443

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/firmware/qcom/qcom_scm.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,10 @@ static DEFINE_SPINLOCK(scm_query_lock);
217217

218218
struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void)
219219
{
220-
return __scm ? __scm->mempool : NULL;
220+
if (!qcom_scm_is_available())
221+
return NULL;
222+
223+
return __scm->mempool;
221224
}
222225

223226
static enum qcom_scm_convention __get_convention(void)

0 commit comments

Comments
 (0)