summaryrefslogtreecommitdiff
path: root/ext/imap/php_imap.c
diff options
context:
space:
mode:
authorGeorge Peter Banyard <girgias@php.net>2021-02-26 03:03:38 +0000
committerGeorge Peter Banyard <girgias@php.net>2021-02-27 13:12:22 +0000
commit1ee6aad248117312fdc9ff7edc3ddd7bd5203d79 (patch)
tree8d32f108c3f30586582ba5e13432ea1363b96da7 /ext/imap/php_imap.c
parent8813f2e0c31a98828cac4570673ccd8ce79b00af (diff)
downloadphp-git-1ee6aad248117312fdc9ff7edc3ddd7bd5203d79.tar.gz
Fix Bug #80800 imap_open() fails when the flags parameter includes CL_EXPUNGE
This also affected imap_reopen(). Add a supplementary test that the CL_EXPUNGE flag does have the intended effect. Closes GH-6732
Diffstat (limited to 'ext/imap/php_imap.c')
-rw-r--r--ext/imap/php_imap.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c
index bf04897c92..9ff1ae0618 100644
--- a/ext/imap/php_imap.c
+++ b/ext/imap/php_imap.c
@@ -735,7 +735,11 @@ PHP_FUNCTION(imap_open)
RETURN_THROWS();
}
- if (flags && ((flags & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | CL_EXPUNGE | OP_DEBUG | OP_SHORTCACHE
+ /* Check for PHP_EXPUNGE and not CL_EXPUNGE as the user land facing CL_EXPUNGE constant is defined
+ * to something different to prevent clashes between CL_EXPUNGE and an OP_* constant allowing setting
+ * the CL_EXPUNGE flag which will expunge when the mailbox is closed (be that manually, or via the
+ * IMAPConnection object being destroyed naturally at the end of the PHP script */
+ if (flags && ((flags & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | PHP_EXPUNGE | OP_DEBUG | OP_SHORTCACHE
| OP_SILENT | OP_PROTOTYPE | OP_SECURE)) != 0)) {
zend_argument_value_error(4, "must be a bitmask of the OP_* constants, and CL_EXPUNGE");
RETURN_THROWS();
@@ -858,7 +862,11 @@ PHP_FUNCTION(imap_reopen)
}
/* TODO Verify these are the only options available as they are pulled from the php.net documentation */
- if (options && ((options & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | OP_EXPUNGE | CL_EXPUNGE)) != 0)) {
+ /* Check for PHP_EXPUNGE and not CL_EXPUNGE as the user land facing CL_EXPUNGE constant is defined
+ * to something different to prevent clashes between CL_EXPUNGE and an OP_* constant allowing setting
+ * the CL_EXPUNGE flag which will expunge when the mailbox is closed (be that manually, or via the
+ * IMAPConnection object being destroyed naturally at the end of the PHP script */
+ if (options && ((options & ~(OP_READONLY | OP_ANONYMOUS | OP_HALFOPEN | OP_EXPUNGE | PHP_EXPUNGE)) != 0)) {
zend_argument_value_error(3, "must be a bitmask of OP_READONLY, OP_ANONYMOUS, OP_HALFOPEN, "
"OP_EXPUNGE, and CL_EXPUNGE");
RETURN_THROWS();