[ 
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 is 
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:
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





> 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 
> is 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.

Reply via email to