Permalink
Browse files

Prevent race condition in event creation. MDL-5956.

Credit goes to Penny, Luke and Martin @ Catalyst.
  • Loading branch information...
1 parent 2277a14 commit e410c5e2e8d103db66607f2a9884aa0379c01295 stronk7 committed Dec 28, 2007
Showing with 22 additions and 18 deletions.
  1. +16 −13 backup/restorelib.php
  2. +6 −5 calendar/event.php
View
29 backup/restorelib.php
@@ -2196,19 +2196,6 @@ function restore_create_events($restore,$xml_file) {
//Assign it to admin
$eve->userid = $adminid;
}
-
- //We must recode the repeatid if the event has it
- if (!empty($eve->repeatid)) {
- $repeat_rec = backup_getid($restore->backup_unique_code,"event_repeatid",$eve->repeatid);
- if ($repeat_rec) { //Exists, so use it...
- $eve->repeatid = $repeat_rec->new_id;
- } else { //Doesn't exists, calculate the next and save it
- $oldrepeatid = $eve->repeatid;
- $max_rec = get_record_sql('SELECT 1, MAX(repeatid) AS repeatid FROM '.$CFG->prefix.'event');
- $eve->repeatid = empty($max_rec) ? 1 : $max_rec->repeatid + 1;
- backup_putid($restore->backup_unique_code,"event_repeatid", $oldrepeatid, $eve->repeatid);
- }
- }
//We have to recode the groupid field
$group = backup_getid($restore->backup_unique_code,"groups",$eve->groupid);
@@ -2221,6 +2208,22 @@ function restore_create_events($restore,$xml_file) {
//The structure is equal to the db, so insert the event
$newid = insert_record ("event",$eve);
+
+ //We must recode the repeatid if the event has it
+ //The repeatid now refers to the id of the original event. (see Bug#5956)
+ if ($newid && !empty($eve->repeatid)) {
+ $repeat_rec = backup_getid($restore->backup_unique_code,"event_repeatid",$eve->repeatid);
+ if ($repeat_rec) { //Exists, so use it...
+ $eve->repeatid = $repeat_rec->new_id;
+ } else { //Doesn't exists, calculate the next and save it
+ $oldrepeatid = $eve->repeatid;
+ $eve->repeatid = $newid;
+ backup_putid($restore->backup_unique_code,"event_repeatid", $oldrepeatid, $eve->repeatid);
+ }
+ $eve->id = $newid;
+ // update the record to contain the correct repeatid
+ update_record('event',$eve);
+ }
} else {
//get current event id
$newid = $eve_db->id;
View
11 calendar/event.php
@@ -205,13 +205,14 @@
if (count($err) == 0) {
$form->timemodified = time();
- if ($form->repeat) {
- $fetch = get_record_sql('SELECT 1, MAX(repeatid) AS repeatid FROM '.$CFG->prefix.'event');
- $form->repeatid = empty($fetch) ? 1 : $fetch->repeatid + 1;
- }
-
/// Get the event id for the log record.
$eventid = insert_record('event', $form, true);
+
+ /// Use the event id as the repeatid to link repeat entries together
+ if ($form->repeat) {
+ $form->repeatid = $form->id = $eventid;
+ update_record('event', $form); // update the row, to set its repeatid
+ }
/// Log the event entry.
add_to_log($form->courseid, 'calendar', 'add', 'event.php?action=edit&id='.$eventid, stripslashes($form->name));

0 comments on commit e410c5e

Please sign in to comment.