From 937c47e90ed8e4fe278f3e7de327bd5344a43659 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Wed, 2 Nov 2022 22:33:10 +0000 Subject: [PATCH] MDL-75789 restore: multi-byte safe substring calculating course names. Co-authored-by: Leon Stringer --- backup/util/dbops/restore_dbops.class.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backup/util/dbops/restore_dbops.class.php b/backup/util/dbops/restore_dbops.class.php index 6734921faa0..32a59012eaa 100644 --- a/backup/util/dbops/restore_dbops.class.php +++ b/backup/util/dbops/restore_dbops.class.php @@ -1806,10 +1806,9 @@ abstract class restore_dbops { public static function calculate_course_names($courseid, $fullname, $shortname) { global $CFG, $DB; - $currentfullname = ''; - $currentshortname = ''; $counter = 0; - // Iteratere while the name exists + + // Iterate while fullname or shortname exist. do { if ($counter) { $suffixfull = ' ' . get_string('copyasnoun') . ' ' . $counter; @@ -1818,8 +1817,11 @@ abstract class restore_dbops { $suffixfull = ''; $suffixshort = ''; } - $currentfullname = $fullname.$suffixfull; - $currentshortname = substr($shortname, 0, 100 - strlen($suffixshort)).$suffixshort; // < 100cc + + // Ensure we don't overflow maximum length of name fields, in multi-byte safe manner. + $currentfullname = core_text::substr($fullname, 0, 254 - strlen($suffixfull)) . $suffixfull; + $currentshortname = core_text::substr($shortname, 0, 100 - strlen($suffixshort)) . $suffixshort; + $coursefull = $DB->get_record_select('course', 'fullname = ? AND id != ?', array($currentfullname, $courseid), '*', IGNORE_MULTIPLE); $courseshort = $DB->get_record_select('course', 'shortname = ? AND id != ?', array($currentshortname, $courseid));