[Devel] [PATCH hci-8.1 v3 2/6] ve/printk: Report potentially leaking usage of ve_printk functions
Vladimir Riabchun
vladimir.riabchun at virtuozzo.com
Mon Oct 12 01:52:29 MSK 2026
We don't want to rely on get_exec_env() value in non-task context.
When this happens, let's issue a WARN and either reject printing or
return host log state.
Some messages may probably go to host dmesg instead of CT, but at
least we won't leak info to random container.
https://virtuozzo.atlassian.net/browse/VSTOR-146839
Feature: ve printk
Signed-off-by: Vladimir Riabchun <vladimir.riabchun at virtuozzo.com>
---
drivers/base/core.c | 6 ++++--
kernel/printk/printk.c | 11 ++++++++---
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 2d233ffb5661..ba50bdbfb648 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -4943,7 +4943,7 @@ static int ve_dev_vprintk_emit(int level, const struct device *dev, const char *
int ve_dev_printk_emit(int dst, int level, const struct device *dev, const char *fmt, ...)
{
va_list args, args2;
- int r;
+ int r = 0;
WARN_ON_ONCE(!dst || (dst & ~VE_LOG_BOTH));
@@ -4952,7 +4952,9 @@ int ve_dev_printk_emit(int dst, int level, const struct device *dev, const char
if (ve_is_super(get_exec_env()) || (dst & VE0_LOG))
r = dev_vprintk_emit(level, dev, fmt, args);
- if ((dst & VE_LOG) && !ve_is_super(get_exec_env()))
+
+ /* Report IRQ usage here - printing to VE requires explicit ve reference */
+ if ((dst & VE_LOG) && !WARN_ON_ONCE(!in_task()) && !ve_is_super(get_exec_env()))
r = ve_dev_vprintk_emit(level, dev, fmt, args2);
va_end(args2);
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index efe2c3279c85..b06fc835d7c7 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -560,7 +560,8 @@ struct log_state *ve_log_state(void)
{
struct log_state *log = &init_log_state;
#ifdef CONFIG_VE
- if (get_exec_env()->log_state)
+ /* get_exec_env() is reliable only in task context */
+ if (!WARN_ON_ONCE(!in_task()) && get_exec_env()->log_state)
log = get_exec_env()->log_state;
#endif
return log;
@@ -2540,7 +2541,9 @@ static asmlinkage int ve_vprintk(int dst, const char *fmt, va_list args)
va_copy(args2, args);
if (ve_is_super(get_exec_env()) || (dst & VE0_LOG))
r = vprintk(fmt, args);
- if ((dst & VE_LOG) && !ve_is_super(get_exec_env()))
+
+ /* Report IRQ usage here - printing to VE requires explicit ve reference */
+ if ((dst & VE_LOG) && !WARN_ON_ONCE(!in_task()) && !ve_is_super(get_exec_env()))
r = ve_vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args2);
va_end(args2);
@@ -2574,7 +2577,9 @@ static asmlinkage int ve_vprintk_deferred(int dst, const char *fmt, va_list args
va_copy(args2, args);
if (ve_is_super(get_exec_env()) || (dst & VE0_LOG))
r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args);
- if ((dst & VE_LOG) && !ve_is_super(get_exec_env()))
+
+ /* Report IRQ usage here - printing to VE requires explicit ve reference */
+ if ((dst & VE_LOG) && !WARN_ON_ONCE(!in_task()) && !ve_is_super(get_exec_env()))
r = ve_vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args2);
va_end(args2);
--
2.52.0
More information about the Devel
mailing list