commit:     5eca691ea3bd543916e7e78c27622fc04c43030e
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Fri Jun  7 12:55:34 2019 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Fri Jun  7 14:07:57 2019 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=5eca691e

dev-php/pecl-zmq: add PHP 7.3 support

Package-Manager: Portage-2.3.67, Repoman-2.3.14
Signed-off-by: Thomas Deutschmann <whissi <AT> gentoo.org>

 .../pecl-zmq-1.1.3-php7-3-compatibility.patch      | 265 +++++++++++++++++++++
 ...cl-zmq-9999.ebuild => pecl-zmq-1.1.3-r2.ebuild} |  15 +-
 dev-php/pecl-zmq/pecl-zmq-9999.ebuild              |   6 +-
 3 files changed, 275 insertions(+), 11 deletions(-)

diff --git a/dev-php/pecl-zmq/files/pecl-zmq-1.1.3-php7-3-compatibility.patch 
b/dev-php/pecl-zmq/files/pecl-zmq-1.1.3-php7-3-compatibility.patch
new file mode 100644
index 00000000000..2de703039b0
--- /dev/null
+++ b/dev-php/pecl-zmq/files/pecl-zmq-1.1.3-php7-3-compatibility.patch
@@ -0,0 +1,265 @@
+From af02bde61c2a5af1ae64cac09ffe2b25237aa58e Mon Sep 17 00:00:00 2001
+From: Alex/AT <a...@alex-at.net>
+Date: Mon, 10 Dec 2018 06:02:27 +0300
+Subject: [PATCH] PHP 7.3 compatibility and bugfixes
+
+- Define new GC_ADDREF/DELREF/SET_REFCOUNT macros for older PHP versions and 
use them instead of direct GC reference counter access
+
+- Fixup all necessary 'long' type parameters to 'zend_long', PHP 7.3 makes it 
mandatory, also fixup some direct function implementations to accept the same
+
+- In php_zmq_recv(), zend_string_init() was wrongly called with third 
parameter as '1', marking new string with IS_STR_PERSISTENT, this caused heap 
corruption and/or segfaults with PHP 7.3 and could possibly cause other sorts 
of bugs under any 7.x version
+  With ZVAL_STRINGL macro, this last '1' parameter meant to copy the string 
and was seemingly erroneously moved to zend_string_init(). zend_string_init() 
copies string by default, and last parameter has totally different meaning here
+
+- In poll(), flag ZVAL separation on passed arrays (PHP 7.3 makes it mandatory)
+
+- Test 19 (exception on connect callback with forced reference parameter): 
skip on PHP 7.1 and higher, PHP >= 7.1 started to fallback to passing argument 
by value instead of failing
+
+- Test 21 (warning generation from callback): it is ok, but PHP 7.3 uses 'int' 
instead of 'integer' for constants, so allow any word in place of the word 
'integer'
+---
+ php_zmq.h                               |  6 ++++
+ tests/019-callbackinvalidsignature.phpt |  3 +-
+ tests/021-callbackwarning.phpt          |  2 +-
+ zmq.c                                   | 40 ++++++++++++-------------
+ zmq_sockopt.c                           |  4 +--
+ 5 files changed, 30 insertions(+), 25 deletions(-)
+
+diff --git a/php_zmq.h b/php_zmq.h
+index ef50bfb..3833967 100644
+--- a/php_zmq.h
++++ b/php_zmq.h
+@@ -44,6 +44,12 @@
+ 
+ #include "php.h"
+ 
++#if PHP_VERSION_ID < 70300
++#define GC_ADDREF(p)              ++GC_REFCOUNT(p)
++#define GC_DELREF(p)              --GC_REFCOUNT(p)
++#define GC_SET_REFCOUNT(p, rc)    GC_REFCOUNT(p) = rc
++#endif
++
+ extern zend_module_entry zmq_module_entry;
+ #define phpext_zmq_ptr &zmq_module_entry
+ 
+diff --git a/tests/019-callbackinvalidsignature.phpt 
b/tests/019-callbackinvalidsignature.phpt
+index 753de31..b5bb20c 100644
+--- a/tests/019-callbackinvalidsignature.phpt
++++ b/tests/019-callbackinvalidsignature.phpt
+@@ -1,7 +1,8 @@
+ --TEST--
+ Test callback edge-cases
+ --SKIPIF--
+-<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
++<?php require_once(dirname(__FILE__) . '/skipif.inc');
++if (PHP_VERSION_ID >= 70100) die("skip PHP 7.1 and higher fallback to passing 
argument by value even when forced to reference"); ?>
+ --FILE--
+ <?php
+ 
+diff --git a/tests/021-callbackwarning.phpt b/tests/021-callbackwarning.phpt
+index 435743e..eba2ecf 100644
+--- a/tests/021-callbackwarning.phpt
++++ b/tests/021-callbackwarning.phpt
+@@ -13,5 +13,5 @@ function generate_warning($a, $b)
+ $socket = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ, 
'persistent_socket', 'generate_warning');
+ 
+ --EXPECTF--
+-Warning: in_array() expects parameter 2 to be array, integer given in %s on 
line %d
++Warning: in_array() expects parameter 2 to be array, %s given in %s on line %d
+ 
+diff --git a/zmq.c b/zmq.c
+index 942e69b..57ebd11 100644
+--- a/zmq.c
++++ b/zmq.c
+@@ -235,7 +235,7 @@ php_zmq_context *php_zmq_context_get(zend_long io_threads, 
zend_bool is_persiste
+               le.type = php_zmq_context_list_entry();
+               le.ptr  = context;
+ 
+-              GC_REFCOUNT(&le) = 1;
++              GC_SET_REFCOUNT(&le, 1);
+ 
+               /* plist_key is not a persistent allocated key, thus we use 
str_update here */
+               if (zend_hash_str_update_mem(&EG(persistent_list), 
plist_key->val, plist_key->len, &le, sizeof(le)) == NULL) {
+@@ -369,7 +369,7 @@ PHP_METHOD(zmq, curvekeypair)
+ PHP_METHOD(zmqcontext, __construct)
+ {
+       php_zmq_context_object *intern;
+-      long io_threads = 1;
++      zend_long io_threads = 1;
+       zend_bool is_persistent = 1;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "|lb", &io_threads, 
&is_persistent) == FAILURE) {
+@@ -495,7 +495,7 @@ PHP_METHOD(zmqcontext, getOpt)
+       Create a new zmq socket
+ */
+ static
+-php_zmq_socket *php_zmq_socket_new(php_zmq_context *context, int type, 
zend_bool is_persistent)
++php_zmq_socket *php_zmq_socket_new(php_zmq_context *context, zend_long type, 
zend_bool is_persistent)
+ {
+       php_zmq_socket *zmq_sock;
+ 
+@@ -503,7 +503,7 @@ php_zmq_socket *php_zmq_socket_new(php_zmq_context 
*context, int type, zend_bool
+       zmq_sock->z_socket    = zmq_socket(context->z_ctx, type);
+       zmq_sock->pid         = getpid();
+       zmq_sock->ctx         = context;
+-    zmq_sock->socket_type = type;
++      zmq_sock->socket_type = type;
+ 
+       if (!zmq_sock->z_socket) {
+               pefree(zmq_sock, is_persistent);
+@@ -535,7 +535,7 @@ void php_zmq_socket_store(php_zmq_socket *zmq_sock_p, 
zend_long type, zend_strin
+       le.type = php_zmq_socket_list_entry();
+       le.ptr  = zmq_sock_p;
+ 
+-      GC_REFCOUNT(&le) = 1;
++      GC_SET_REFCOUNT(&le, 1);
+ 
+       plist_key = php_zmq_socket_plist_key(type, persistent_id, 
use_shared_ctx);
+ 
+@@ -796,7 +796,7 @@ PHP_METHOD(zmqsocket, __construct)
+ 
+ /* {{{ static zend_bool php_zmq_send(php_zmq_socket_object *intern, char 
*message_param, long flags)
+ */
+-static zend_bool php_zmq_send(php_zmq_socket_object *intern, zend_string 
*message_param, long flags)
++static zend_bool php_zmq_send(php_zmq_socket_object *intern, zend_string 
*message_param, zend_long flags)
+ {
+       int rc, errno_;
+       zmq_msg_t message;
+@@ -828,7 +828,7 @@ static void 
php_zmq_sendmsg_impl(INTERNAL_FUNCTION_PARAMETERS)
+ {
+       php_zmq_socket_object *intern;
+       zend_string *message_param;
+-      long flags = 0;
++      zend_long flags = 0;
+       zend_bool ret;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|l", &message_param, 
&flags) == FAILURE) {
+@@ -890,7 +890,7 @@ PHP_METHOD(zmqsocket, sendmulti)
+       zval *messages;
+       php_zmq_socket_object *intern;
+       int to_send, ret = 0;
+-      long flags = 0;
++      zend_long flags = 0;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|l", &messages, &flags) == 
FAILURE) {
+               return;
+@@ -910,7 +910,7 @@ PHP_METHOD(zmqsocket, sendmulti)
+ /* {{{ static zend_bool php_zmq_recv(php_zmq_socket_object *intern, long 
flags, zval *return_value)
+ */
+ static
+-zend_string *php_zmq_recv(php_zmq_socket_object *intern, long flags)
++zend_string *php_zmq_recv(php_zmq_socket_object *intern, zend_long flags)
+ {
+       int rc, errno_;
+       zmq_msg_t message;
+@@ -933,7 +933,7 @@ zend_string *php_zmq_recv(php_zmq_socket_object *intern, 
long flags)
+               return NULL;
+       }
+ 
+-      str = zend_string_init(zmq_msg_data(&message), zmq_msg_size(&message), 
1);
++      str = zend_string_init(zmq_msg_data(&message), zmq_msg_size(&message), 
0);
+       zmq_msg_close(&message);
+       return str;
+ }
+@@ -943,7 +943,7 @@ static void 
php_zmq_recvmsg_impl(INTERNAL_FUNCTION_PARAMETERS)
+ {
+       zend_string *str = NULL;
+       php_zmq_socket_object *intern;
+-      long flags = 0;
++      zend_long flags = 0;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &flags) == FAILURE) {
+               return;
+@@ -974,7 +974,7 @@ PHP_METHOD(zmqsocket, recvmulti)
+ {
+       php_zmq_socket_object *intern;
+       size_t value_len;
+-      long flags = 0;
++      zend_long flags = 0;
+ #if ZMQ_VERSION_MAJOR < 3
+       int64_t value;
+ #else
+@@ -1303,7 +1303,7 @@ PHP_METHOD(zmqpoll, add)
+ {
+       php_zmq_poll_object *intern;
+       zval *object;
+-      long events;
++      zend_long events;
+       int error;
+       zend_string *key;
+ 
+@@ -1423,10 +1423,10 @@ PHP_METHOD(zmqpoll, poll)
+       php_zmq_poll_object *intern;
+       zval *r_array, *w_array;
+ 
+-      long timeout = -1;
++      zend_long timeout = -1;
+       int rc;
+ 
+-      if (zend_parse_parameters(ZEND_NUM_ARGS(), "a!a!|l", &r_array, 
&w_array, &timeout) == FAILURE) {
++      if (zend_parse_parameters(ZEND_NUM_ARGS(), "a!/a!/|l", &r_array, 
&w_array, &timeout) == FAILURE) {
+               return;
+       }
+ 
+@@ -1592,7 +1592,7 @@ void s_clear_device_callback (php_zmq_device_cb_t *cb)
+ }
+ 
+ static
+-void s_init_device_callback (php_zmq_device_cb_t *cb, zend_fcall_info *fci, 
zend_fcall_info_cache *fci_cache, long timeout, zval *user_data)
++void s_init_device_callback (php_zmq_device_cb_t *cb, zend_fcall_info *fci, 
zend_fcall_info_cache *fci_cache, zend_long timeout, zval *user_data)
+ {
+       memcpy (&cb->fci, fci, sizeof (zend_fcall_info));
+       memcpy (&cb->fci_cache, fci_cache, sizeof (zend_fcall_info_cache));
+@@ -1615,7 +1615,7 @@ void s_init_device_callback (php_zmq_device_cb_t *cb, 
zend_fcall_info *fci, zend
+ PHP_METHOD(zmqdevice, setidletimeout)
+ {
+       php_zmq_device_object *intern;
+-      long timeout;
++      zend_long timeout;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &timeout) == FAILURE) {
+               return;
+@@ -1644,7 +1644,7 @@ PHP_METHOD(zmqdevice, getidletimeout)
+ PHP_METHOD(zmqdevice, settimertimeout)
+ {
+       php_zmq_device_object *intern;
+-      long timeout;
++      zend_long timeout;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &timeout) == FAILURE) {
+               return;
+@@ -1676,7 +1676,7 @@ PHP_METHOD(zmqdevice, setidlecallback)
+       zval *user_data = NULL;
+       zend_fcall_info fci;
+       zend_fcall_info_cache fci_cache;
+-      long timeout = 0;
++      zend_long timeout = 0;
+ 
+       if (ZEND_NUM_ARGS() == 2) {
+               php_error_docref(NULL, E_DEPRECATED, "The signature for 
setIdleCallback has changed, please update your code");
+@@ -1718,7 +1718,7 @@ PHP_METHOD(zmqdevice, settimercallback)
+       zval *user_data = NULL;
+       zend_fcall_info fci;
+       zend_fcall_info_cache fci_cache;
+-      long timeout;
++      zend_long timeout;
+ 
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "fl|z!", &fci, &fci_cache, 
&timeout, &user_data) == FAILURE) {
+               return;
+diff --git a/zmq_sockopt.c b/zmq_sockopt.c
+index 1357032..3a00421 100644
+--- a/zmq_sockopt.c
++++ b/zmq_sockopt.c
+@@ -1,5 +1,3 @@
+-
+-
+ /*
+ 
+-----------------------------------------------------------------------------------+
+ |  ZMQ extension for PHP                                                      
      |
+@@ -2033,7 +2031,7 @@ PHP_METHOD(zmqsocket, getsockopt)
+ PHP_METHOD(zmqsocket, setsockopt)
+ {
+     php_zmq_socket_object *intern;
+-    long key;
++    zend_long key;
+     zval *zv;
+ 
+     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz/", &key, &zv) == 
FAILURE) {

diff --git a/dev-php/pecl-zmq/pecl-zmq-9999.ebuild 
b/dev-php/pecl-zmq/pecl-zmq-1.1.3-r2.ebuild
similarity index 60%
copy from dev-php/pecl-zmq/pecl-zmq-9999.ebuild
copy to dev-php/pecl-zmq/pecl-zmq-1.1.3-r2.ebuild
index 0045fcc8b0a..32a8fed8aad 100644
--- a/dev-php/pecl-zmq/pecl-zmq-9999.ebuild
+++ b/dev-php/pecl-zmq/pecl-zmq-1.1.3-r2.ebuild
@@ -1,13 +1,13 @@
-# Copyright 1999-2018 Gentoo Foundation
+# Copyright 1999-2019 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI="7"
 
-USE_PHP="php5-6 php7-0 php7-1 php7-2"
+USE_PHP="php5-6 php7-0 php7-1 php7-2 php7-3"
 
-inherit php-ext-pecl-r3 git-r3
+inherit php-ext-pecl-r3
 
-KEYWORDS=""
+KEYWORDS="~amd64 ~x86"
 
 DESCRIPTION="PHP Bindings for ZeroMQ messaging"
 LICENSE="BSD"
@@ -16,9 +16,8 @@ IUSE="czmq"
 
 RDEPEND="net-libs/zeromq czmq? ( <net-libs/czmq-3 )"
 DEPEND="${RDEPEND} virtual/pkgconfig"
-SRC_URI=""
-EGIT_REPO_URI="https://github.com/mkoppanen/php-zmq.git";
-EGIT_CHECKOUT_DIR="${PHP_EXT_S}"
+
+PATCHES=( "${FILESDIR}"/${P}-php7-3-compatibility.patch )
 
 src_configure() {
        local PHP_EXT_ECONF_ARGS=( $(use_with czmq) )

diff --git a/dev-php/pecl-zmq/pecl-zmq-9999.ebuild 
b/dev-php/pecl-zmq/pecl-zmq-9999.ebuild
index 0045fcc8b0a..cafe2beba8f 100644
--- a/dev-php/pecl-zmq/pecl-zmq-9999.ebuild
+++ b/dev-php/pecl-zmq/pecl-zmq-9999.ebuild
@@ -1,9 +1,9 @@
-# Copyright 1999-2018 Gentoo Foundation
+# Copyright 1999-2019 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
-EAPI=6
+EAPI="7"
 
-USE_PHP="php5-6 php7-0 php7-1 php7-2"
+USE_PHP="php5-6 php7-0 php7-1 php7-2 php7-3"
 
 inherit php-ext-pecl-r3 git-r3
 

Reply via email to