[
https://issues.apache.org/jira/browse/LOG4PHP-117?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maciej Mazur updated LOG4PHP-117:
---------------------------------
Description:
This apply to src/main/php/configurators/LoggerConfiguratorIni.php
If you invoke LoggerConfiguratorIni::configure() after there was any notice or
warning in your PHP script, then LoggerConfiguratorIni will throw an exception
even if there is no need (propably terminating execution)
284 public function configure(LoggerHierarchy $hierarchy, $url =
'') {
285 $properties = @parse_ini_file($url);
286 if ($properties === false || count($properties) == 0) {
287 $error = error_get_last();
288 throw new LoggerException("LoggerConfiguratorIni:
".$error['message']);
289 }
290 return $this->doConfigureProperties($properties,
$hierarchy);
291 }
In line 287 it is checked if there was any error triggered by function
parse_ini_file. Unfortunately function error_get_last() doesn't return an error
triggered by execution of the last function. It returnes an error that ist most
recent in global, even if it was already catched and taken care of. This is
because there is no way to reset the state of the last error. It returns always
the last triggered error.
(http://www.php.net/manual/en/function.error-get-last.php#83608)
I attached the patch that "solves" this by triggering an empty error before
parse_ini_file(), and the it is checked if the error has an empty message:
public function configure(LoggerHierarchy $hierarchy, $url = '') {
@trigger_error('');
$properties = @parse_ini_file($url);
if ($properties === false || count($properties) == 0) {
$error = error_get_last();
if ($error['message'] != '') {
throw new
LoggerException("LoggerConfiguratorIni: ".$error['message']);
}
}
return $this->doConfigureProperties($properties, $hierarchy);
}
This not very pretty but it works
was:
If you invoke LoggerConfiguratorIni::configure() after there was any notice or
warning in your PHP script, then LoggerConfiguratorIni will throw an exception
even if there is no need (propably terminating execution)
284 public function configure(LoggerHierarchy $hierarchy, $url =
'') {
285 $properties = @parse_ini_file($url);
286 if ($properties === false || count($properties) == 0) {
287 $error = error_get_last();
288 throw new LoggerException("LoggerConfiguratorIni:
".$error['message']);
289 }
290 return $this->doConfigureProperties($properties,
$hierarchy);
291 }
In line 287 it is checked if there was any error triggered by function
parse_ini_file. Unfortunately function error_get_last() doesn't return an error
triggered by execution of the last function. It returnes an error that ist most
recent in global, even if it was already catched and taken care of. This is
because there is no way to reset the state of the last error. It returns always
the last triggered error.
(http://www.php.net/manual/en/function.error-get-last.php#83608)
I attached the patch that "solves" this by triggering an empty error before
parse_ini_file(), and the it is checked if the error has an empty message:
public function configure(LoggerHierarchy $hierarchy, $url = '') {
@trigger_error('');
$properties = @parse_ini_file($url);
if ($properties === false || count($properties) == 0) {
$error = error_get_last();
if ($error['message'] != '') {
throw new
LoggerException("LoggerConfiguratorIni: ".$error['message']);
}
}
return $this->doConfigureProperties($properties, $hierarchy);
}
This not very pretty but it works
> LoggerConfiguratorIni::configure() and unexptected results from
> error_get_last()
> --------------------------------------------------------------------------------
>
> Key: LOG4PHP-117
> URL: https://issues.apache.org/jira/browse/LOG4PHP-117
> Project: Log4php
> Issue Type: Bug
> Components: Code
> Affects Versions: 2.0
> Reporter: Maciej Mazur
> Attachments: error_get_last_patch
>
>
> This apply to src/main/php/configurators/LoggerConfiguratorIni.php
> If you invoke LoggerConfiguratorIni::configure() after there was any notice
> or warning in your PHP script, then LoggerConfiguratorIni will throw an
> exception even if there is no need (propably terminating execution)
> 284 public function configure(LoggerHierarchy $hierarchy, $url =
> '') {
> 285 $properties = @parse_ini_file($url);
> 286 if ($properties === false || count($properties) == 0) {
> 287 $error = error_get_last();
> 288 throw new LoggerException("LoggerConfiguratorIni:
> ".$error['message']);
> 289 }
> 290 return $this->doConfigureProperties($properties,
> $hierarchy);
> 291 }
> In line 287 it is checked if there was any error triggered by function
> parse_ini_file. Unfortunately function error_get_last() doesn't return an
> error triggered by execution of the last function. It returnes an error that
> ist most recent in global, even if it was already catched and taken care of.
> This is because there is no way to reset the state of the last error. It
> returns always the last triggered error.
> (http://www.php.net/manual/en/function.error-get-last.php#83608)
> I attached the patch that "solves" this by triggering an empty error before
> parse_ini_file(), and the it is checked if the error has an empty message:
> public function configure(LoggerHierarchy $hierarchy, $url = '') {
> @trigger_error('');
> $properties = @parse_ini_file($url);
> if ($properties === false || count($properties) == 0) {
> $error = error_get_last();
> if ($error['message'] != '') {
> throw new
> LoggerException("LoggerConfiguratorIni: ".$error['message']);
> }
> }
> return $this->doConfigureProperties($properties, $hierarchy);
> }
> This not very pretty but it works
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.