Skip to content

Commit

Permalink
MDL-37746 qtype_shortanser: avoid normalizer_normalize dangers.
Browse files Browse the repository at this point in the history
When an error occurs, normalizer_normalize just silently returns null,
which is dangerous. Here, we wrap it in a safe helper function.
  • Loading branch information
timhunt committed Jan 31, 2013
1 parent 1918a24 commit a74d924
Showing 1 changed file with 29 additions and 4 deletions.
33 changes: 29 additions & 4 deletions question/type/shortanswer/question.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ public function compare_response_with_answer(array $response, question_answer $a
}

public static function compare_string_with_wildcard($string, $pattern, $ignorecase) {

// Normalise any non-canonical UTF-8 characters before we start.
$pattern = self::safe_normalize($pattern);
$string = self::safe_normalize($string);

// Break the string on non-escaped asterisks.
$bits = preg_split('/(?<!\\\\)\*/', $pattern);
// Escape regexp special characters in the bits.
Expand All @@ -102,12 +107,32 @@ public static function compare_string_with_wildcard($string, $pattern, $ignoreca
$regexp .= 'i';
}

if (function_exists('normalizer_normalize')) {
$regexp = normalizer_normalize($regexp, Normalizer::FORM_C);
$string = normalizer_normalize($string, Normalizer::FORM_C);
return preg_match($regexp, trim($string));
}

/**
* Normalise a UTf-8 string to FORM_C, avoiding the pitfalls in PHP's
* normalizer_normalize function.
* @param string $string the input string.
* @return string the normalised string.
*/
protected static function safe_normalize($string) {
if (!$string) {
return '';
}

return preg_match($regexp, trim($string));
if (!function_exists('normalizer_normalize')) {
return $string;
}

$normalised = normalizer_normalize($string, Normalizer::FORM_C);
if (!$normalised) {
// An error occurred in normalizer_normalize, but we have no idea what.
debugging('Failed to normalise string: ' . $string, DEBUG_DEVELOPER);
return $string; // Return the original string, since it is the best we have.
}

return $normalised;
}

public function get_correct_response() {
Expand Down

0 comments on commit a74d924

Please sign in to comment.