Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Auto-linking filters: fix serious caching bug in forum mailouts

Autolinking of glossaries, activity, resources and wiki names were using a
trivial single-entry cache implemented with static vars. The cache was _not_
keyed on course.

This bug was visible during forum_cron() which walks many courses. The cache
would get "stuck" on the first course that had something to put in the cache.
All mailouts from there onwards would autolink to stuff in the wrong course.
  • Loading branch information...
commit 0f1f94408afcda308e8a47a826538a61b73b6f55 1 parent 61231d5
martinlanghoff authored
View
8 filter/activitynames/filter.php
@@ -8,12 +8,20 @@ function activitynames_filter($courseid, $text) {
global $CFG;
+ // Trivial-cache - keyed on $cachedcourseid
static $activitylist;
+ static $cachedcourse;
if (empty($courseid)) {
$courseid = SITEID;
}
+ // Initialise/invalidate our trivial cache if dealing with a different course
+ if (!isset($cachedcourseid) || $cachedcourseid !== (int)$courseid) {
+ $activitylist = array();
+ }
+ $cachedcourseid = (int)$courseid;
+
/// It may be cached
if (empty($activitylist)) {
View
17 mod/glossary/filter.php
@@ -3,17 +3,26 @@
function glossary_filter($courseid, $text) {
global $CFG;
+ // Trivial-cache - keyed on $cachedcourseid
static $nothingtodo;
static $conceptlist;
-
- if (!empty($nothingtodo)) { // We've been here in this page already
- return $text;
- }
+ static $cachedcourseid;
if (empty($courseid)) {
$courseid = SITEID;
}
+ // Initialise/invalidate our trivial cache if dealing with a different course
+ if (!isset($cachedcourseid) || $cachedcourseid !== (int)$courseid) {
+ $conceptlist = array();
+ $nothingtodo = false;
+ }
+ $cachedcourseid = (int)$courseid;
+
+ if ($nothingtodo === true) {
+ return $text;
+ }
+
/// Create a list of all the concepts to search for. It may be cached already.
if (empty($conceptlist)) {
View
15 mod/resource/filter.php
@@ -7,15 +7,24 @@ function resource_filter($courseid, $text) {
global $CFG;
+ // Trivial-cache - keyed on $cachedcourseid
static $nothingtodo;
static $resourcelist;
+ static $cachedcourseid;
- if (!empty($nothingtodo)) { // We've been here in this page already
+ // if we don't have a courseid, we can't run the query, so
+ if (empty($courseid)) {
return $text;
}
- // if we don't have a courseid, we can't run the query, so
- if (empty($courseid)) {
+ // Initialise/invalidate our trivial cache if dealing with a different course
+ if (!isset($cachedcourseid) || $cachedcourseid !== (int)$courseid) {
+ $resourcelist = array();
+ $nothingtodo = false;
+ }
+ $cachedcourseid = (int)$courseid;
+
+ if ($nothingtodo === true) {
return $text;
}
View
17 mod/wiki/filter.php
@@ -10,17 +10,26 @@ function wiki_filter($courseid, $text) {
global $CFG;
+ // Trivial-cache - keyed on $cachedcourseid
static $nothingtodo;
static $wikipagelist;
-
- if (!empty($nothingtodo)) { // We've been here in this page already
- return $text;
- }
+ static $cachedcourseid;
if (empty($courseid)) {
$courseid = SITEID;
}
+ // Initialise/invalidate our trivial cache if dealing with a different course
+ if (!isset($cachedcourseid) || $cachedcourseid !== (int)$courseid) {
+ $wikipagelist = array();
+ $nothingtodo = false;
+ }
+ $cachedcourseid = (int)$courseid;
+
+ if (!empty($nothingtodo)) { // We've been here in this page already
+ return $text;
+ }
+
/// Create a list of all the wikis to search for. It may be cached already.
if (empty($wikipagelist)) {
Please sign in to comment.
Something went wrong with that request. Please try again.