]> sourceware.org Git - systemtap.git/commitdiff
Check for a valid address in rcu_dereference().
authorDavid Smith <dsmith@redhat.com>
Wed, 29 May 2013 14:31:46 +0000 (09:31 -0500)
committerDavid Smith <dsmith@redhat.com>
Wed, 29 May 2013 14:31:46 +0000 (09:31 -0500)
* tapset/linux/rcu.stp: Call kderef() to make sure the address is safe to
  read.

tapset/linux/rcu.stp

index c99023487f67471e5cd7790efa78bc434d68f59b..8d2e286e7fbae374ed59c20a7ffe1fae84d66022 100644 (file)
 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();
 %}
This page took 0.026864 seconds and 5 git commands to generate.