From 1ee6aad248117312fdc9ff7edc3ddd7bd5203d79 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 26 Feb 2021 03:03:38 +0000 Subject: 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 --- NEWS | 4 +++ ext/imap/php_imap.c | 12 +++++-- ext/imap/tests/bug80800.phpt | 21 +++++++++++ ext/imap/tests/imap_open_with_cl_expunge.phpt | 43 ++++++++++++++++++++++ ext/imap/tests/imap_reopen_with_cl_expunge.phpt | 48 +++++++++++++++++++++++++ ext/imap/tests/setup/imap_include.inc | 11 ++++-- 6 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 ext/imap/tests/bug80800.phpt create mode 100644 ext/imap/tests/imap_open_with_cl_expunge.phpt create mode 100644 ext/imap/tests/imap_reopen_with_cl_expunge.phpt diff --git a/NEWS b/NEWS index 18bd50a986..aefef64c28 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,10 @@ PHP NEWS - Core: . Fixed bug #75776 (Flushing streams with compression filter is broken). (cmb) +- IMAP: + . Fixed bug #80800 (imap_open() fails when the flags parameter includes + CL_EXPUNGE). (girgias) + - Intl: . Fixed bug #80763 (msgfmt_format() does not accept DateTime references). (cmb) 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(); diff --git a/ext/imap/tests/bug80800.phpt b/ext/imap/tests/bug80800.phpt new file mode 100644 index 0000000000..d75c1fde80 --- /dev/null +++ b/ext/imap/tests/bug80800.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #80800: imap_open() fails when the flags parameter includes CL_EXPUNGE +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +Connected without any issues diff --git a/ext/imap/tests/imap_open_with_cl_expunge.phpt b/ext/imap/tests/imap_open_with_cl_expunge.phpt new file mode 100644 index 0000000000..5d1721f861 --- /dev/null +++ b/ext/imap/tests/imap_open_with_cl_expunge.phpt @@ -0,0 +1,43 @@ +--TEST-- +Test imap_open() using the CL_EXPUNGE flag +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 3 msgs +New mailbox created + +-- Call to imap_close() -- +bool(true) +There are now 0 msgs in mailbox '%sINBOX.phpttestimapopenwithclexpunge' +bool(true) diff --git a/ext/imap/tests/imap_reopen_with_cl_expunge.phpt b/ext/imap/tests/imap_reopen_with_cl_expunge.phpt new file mode 100644 index 0000000000..78d1eddaca --- /dev/null +++ b/ext/imap/tests/imap_reopen_with_cl_expunge.phpt @@ -0,0 +1,48 @@ +--TEST-- +Test imap_reopen() using the CL_EXPUNGE flag +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECTF-- +Create a temporary mailbox and add 3 msgs +New mailbox created +bool(true) + +-- Call to imap_close() -- +bool(true) +There are now 0 msgs in mailbox '%sINBOX.phpttestimapreopenwithclexpunge' +bool(true) diff --git a/ext/imap/tests/setup/imap_include.inc b/ext/imap/tests/setup/imap_include.inc index 223278f077..0c07f9ae2d 100644 --- a/ext/imap/tests/setup/imap_include.inc +++ b/ext/imap/tests/setup/imap_include.inc @@ -63,12 +63,19 @@ function displayOverviewFields($resp, array $fields = MANDATORY_OVERVIEW_FIELDS) * @param int message_count number of test msgs to be written to new mailbox * @param null $new_mailbox * @param bool $simpleMessages + * @param int $flags OP_* (or CL_EXPUNGE) flags to pass to imap_open() sub-call * @return resource IMAP stream to new mailbox * @throws Exception */ -function setup_test_mailbox(string $mailbox_suffix, int $message_count, &$new_mailbox = null, bool $simpleMessages = true){ +function setup_test_mailbox( + string $mailbox_suffix, + int $message_count, + &$new_mailbox = null, + bool $simpleMessages = true, + int $flags = 0, +){ // open a stream to default mailbox - $imap_stream = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD); + $imap_stream = imap_open(IMAP_DEFAULT_MAILBOX, IMAP_MAILBOX_USERNAME, IMAP_MAILBOX_PASSWORD, flags: $flags); if ($imap_stream === false) { throw new Exception("Cannot connect to IMAP server " . IMAP_SERVER . ": " . imap_last_error()); -- cgit v1.2.1