Fix GH-7875: mails are sent even if failure to log throws exception

We explicitly check for an exception after the logging attempt, and
bail out in that case.

Co-authored-by: Tim Düsterhus <timwolla@googlemail.com>

Closes GH-7878.
This commit is contained in:
Christoph M. Becker 2022-01-04 15:44:56 +01:00
parent ee8f9d75c0
commit 478edcdacb
No known key found for this signature in database
GPG Key ID: D66C9593118BCCB6
3 changed files with 43 additions and 0 deletions

4
NEWS
View File

@ -16,6 +16,10 @@ PHP NEWS
- Sockets:
. Fixed ext/sockets build on Haiku. (David Carlier)
- Standard:
. Fixed bug GH-7875 (mails are sent even if failure to log throws exception).
(cmb)
20 Jan 2022, PHP 8.0.15
- Core:

View File

@ -473,6 +473,10 @@ PHPAPI int php_mail(const char *to, const char *subject, const char *message, co
efree(logline);
}
if (EG(exception)) {
MAIL_RET(0);
}
if (PG(mail_x_header)) {
const char *tmp = zend_get_executed_filename();
zend_string *f;

View File

@ -0,0 +1,35 @@
--TEST--
GH-7875 (mails are sent even if failure to log throws exception)
--INI--
sendmail_path={MAIL:{PWD}/gh7875.mail.out}
mail.log={PWD}/gh7875.mail.log
--FILE--
<?php
function exception_error_handler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");
touch(__DIR__ . "/gh7875.mail.log");
chmod(__DIR__ . "/gh7875.mail.log", 0444);
try {
mail('recipient@example.com', 'Subject', 'Body', []);
echo 'Not Reached';
} catch (\Exception $e) {
echo $e->getMessage(), PHP_EOL;
var_dump(file_exists(__DIR__ . "/gh7875.mail.out"));
}
?>
--CLEAN--
<?php
@chmod(__DIR__ . "/gh7875.mail.log", 0644);
@unlink(__DIR__ . "/gh7875.mail.log");
@unlink(__DIR__ . "/gh7875.mail.out");
?>
--EXPECTF--
mail(%s): Failed to open stream: Permission denied
bool(false)