diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php
index c67cea112..71f12b91a 100644
--- a/classes/display/HTMLDisplayHandler.php
+++ b/classes/display/HTMLDisplayHandler.php
@@ -201,7 +201,7 @@ class HTMLDisplayHandler
if(is_array(Context::get('INPUT_ERROR')))
{
$INPUT_ERROR = Context::get('INPUT_ERROR');
- $keys = array_keys($INPUT_ERROR);
+ $keys = array_map(function($str) { return preg_quote($str, '@'); }, array_keys($INPUT_ERROR));
$keys = '(' . implode('|', $keys) . ')';
$output = preg_replace_callback('@(]*?)\sname="' . $keys . '"([^>]*?)/?>@is', array(&$this, '_preserveValue'), $output);
@@ -259,42 +259,28 @@ class HTMLDisplayHandler
// get type
$type = 'text';
- if(preg_match('/\stype="([a-z]+)"/i', $str, $m))
+ if(preg_match('/\stype="([^"]+)"/i', $str, $m))
{
$type = strtolower($m[1]);
}
switch($type)
{
- case 'text':
- case 'hidden':
- case 'email':
- case 'search':
- case 'tel':
- case 'url':
- case 'email':
- case 'datetime':
- case 'date':
- case 'month':
- case 'week':
- case 'time':
- case 'datetime-local':
- case 'number':
- case 'range':
- case 'color':
- $str = preg_replace('@\svalue="[^"]*?"@', ' ', $str) . ' value="' . htmlspecialchars($INPUT_ERROR[$match[3]], ENT_COMPAT | ENT_HTML401, 'UTF-8', false) . '"';
- break;
- case 'password':
- $str = preg_replace('@\svalue="[^"]*?"@', ' ', $str);
- break;
case 'radio':
case 'checkbox':
- $str = preg_replace('@\schecked(="[^"]*?")?@', ' ', $str);
- if(@preg_match('@\s(?i:value)="' . $INPUT_ERROR[$match[3]] . '"@', $str))
+ if(preg_match('@\s(?i:value)="' . preg_quote($INPUT_ERROR[$match[3]], '@') . '"@', $str))
{
- $str .= ' checked="checked"';
+ $str = preg_replace('@\schecked(="[^"]*?")?@', ' checked="checked"', $str);
}
break;
+ default:
+ if (!preg_match('@\svalue="([^"]*?)"@', $str))
+ {
+ $str = $str . ' value=""';
+ }
+ $str = preg_replace_callback('@\svalue="([^"]*?)"@', function() use($INPUT_ERROR, $match) {
+ return ' value="' . escape($INPUT_ERROR[$match[3]], true) . '"';
+ }, $str);
}
return $str . ' />';
@@ -333,7 +319,7 @@ class HTMLDisplayHandler
{
$INPUT_ERROR = Context::get('INPUT_ERROR');
preg_match('@@is', $matches[0], $mm);
- return $mm[0] . $INPUT_ERROR[$matches[1]] . '';
+ return $mm[0] . escape($INPUT_ERROR[$matches[1]], true) . '';
}
/**
diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php
index 80cb7ad62..23671c859 100644
--- a/classes/module/ModuleHandler.class.php
+++ b/classes/module/ModuleHandler.class.php
@@ -909,7 +909,7 @@ class ModuleHandler extends Handler
public static function _setInputValueToSession()
{
$requestVars = Context::getRequestVars();
- unset($requestVars->act, $requestVars->mid, $requestVars->vid, $requestVars->success_return_url, $requestVars->error_return_url);
+ unset($requestVars->act, $requestVars->mid, $requestVars->vid, $requestVars->success_return_url, $requestVars->error_return_url, $requestVars->xe_validator_id);
foreach($requestVars AS $key => $value)
{
$_SESSION['INPUT_ERROR'][$key] = $value;