From 2e5f066231cc5a19e74cb012724438acdd920fb7 Mon Sep 17 00:00:00 2001 From: David Smith Date: Wed, 29 May 2013 09:31:46 -0500 Subject: [PATCH] Check for a valid address in rcu_dereference(). * tapset/linux/rcu.stp: Call kderef() to make sure the address is safe to read. --- tapset/linux/rcu.stp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tapset/linux/rcu.stp b/tapset/linux/rcu.stp index c99023487..8d2e286e7 100644 --- a/tapset/linux/rcu.stp +++ b/tapset/linux/rcu.stp @@ -16,10 +16,17 @@ function rcu_dereference:long (protected_pointer:long) %{ /* pure */ void *protected_pointer = (void *)(long)STAP_ARG_protected_pointer; long fetched_value; - #ifndef STAP_ALWAYS_ACQUIRE_RCU_LOCK int lock_acquired = 0; +#endif + /* We call kderef() here to ensure the memory is valid to read. + * Note the result is thrown away, then we use the "real" + * rcu_dereference function now that we know the address is + * safe. */ + (void)kderef(sizeof(*protected_pointer), protected_pointer); + +#ifndef STAP_ALWAYS_ACQUIRE_RCU_LOCK if (! rcu_read_lock_held()) { rcu_read_lock(); lock_acquired = 1; @@ -38,4 +45,5 @@ function rcu_dereference:long (protected_pointer:long) %{ /* pure */ rcu_read_unlock(); #endif STAP_RETVALUE = fetched_value; + CATCH_DEREF_FAULT(); %} -- 2.43.5