From 88e2423e2670f63720714b07ad80094dd6b2211c Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 28 Jun 2018 09:51:09 +0200 Subject: add upstream patches for 7.3 --- 073067ba96ac99ed5696d27f13ca6c8124986e74.patch | 743 +++++++++++++++++++++++++ PHPINFO | 7 + REFLECTION | 2 +- a8835aab2c15e794fce13bd927295719e384ad2d.patch | 299 ++++++++++ php-pecl-ssh2.spec | 17 +- 5 files changed, 1063 insertions(+), 5 deletions(-) create mode 100644 073067ba96ac99ed5696d27f13ca6c8124986e74.patch create mode 100644 PHPINFO create mode 100644 a8835aab2c15e794fce13bd927295719e384ad2d.patch diff --git a/073067ba96ac99ed5696d27f13ca6c8124986e74.patch b/073067ba96ac99ed5696d27f13ca6c8124986e74.patch new file mode 100644 index 0000000..d266edb --- /dev/null +++ b/073067ba96ac99ed5696d27f13ca6c8124986e74.patch @@ -0,0 +1,743 @@ +From 073067ba96ac99ed5696d27f13ca6c8124986e74 Mon Sep 17 00:00:00 2001 +From: Jan-E +Date: Thu, 28 Jun 2018 08:43:48 +0200 +Subject: [PATCH] @dstogov Fixed PHP7 port. Restored commented reference + counting. + +--- + php_ssh2.h | 14 +++--- + ssh2.c | 26 +++++----- + ssh2_fopen_wrappers.c | 129 ++++++++++++++++++++++---------------------------- + ssh2_sftp.c | 59 ++++++++++------------- + 4 files changed, 102 insertions(+), 126 deletions(-) + +diff --git a/php_ssh2.h b/php_ssh2.h +index d010ff9..2bbaa26 100644 +--- a/php_ssh2.h ++++ b/php_ssh2.h +@@ -73,14 +73,14 @@ typedef struct _php_ssh2_sftp_data { + LIBSSH2_SESSION *session; + LIBSSH2_SFTP *sftp; + +- int session_rsrcid; ++ zend_resource *session_rsrc; + } php_ssh2_sftp_data; + + typedef struct _php_ssh2_listener_data { + LIBSSH2_SESSION *session; + LIBSSH2_LISTENER *listener; + +- int session_rsrcid; ++ zend_resource *session_rsrc; + } php_ssh2_listener_data; + + #include "libssh2_publickey.h" +@@ -89,7 +89,7 @@ typedef struct _php_ssh2_pkey_subsys_data { + LIBSSH2_SESSION *session; + LIBSSH2_PUBLICKEY *pkey; + +- int session_rsrcid; ++ zend_resource *session_rsrc; + } php_ssh2_pkey_subsys_data; + + #define SSH2_FETCH_NONAUTHENTICATED_SESSION(session, zsession) \ +@@ -118,8 +118,8 @@ typedef struct _php_ssh2_channel_data { + char is_blocking; + long timeout; + +- /* Resource ID */ +- int session_rsrcid; ++ /* Resource */ ++ zend_resource *session_rsrc; + + /* Allow one stream to be closed while the other is kept open */ + unsigned char *refcount; +@@ -151,8 +151,8 @@ PHP_FUNCTION(ssh2_sftp_realpath); + LIBSSH2_SESSION *php_ssh2_session_connect(char *host, int port, zval *methods, zval *callbacks); + void php_ssh2_sftp_dtor(zend_resource *rsrc); + php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stream_context *context, +- LIBSSH2_SESSION **psession, int *presource_id, +- LIBSSH2_SFTP **psftp, int *psftp_rsrcid); ++ LIBSSH2_SESSION **psession, zend_resource **presource, ++ LIBSSH2_SFTP **psftp, zend_resource **psftp_rsrc); + + extern php_stream_ops php_ssh2_channel_stream_ops; + +diff --git a/ssh2.c b/ssh2.c +index e73867e..849766b 100644 +--- a/ssh2.c ++++ b/ssh2.c +@@ -772,9 +772,8 @@ PHP_FUNCTION(ssh2_forward_listen) + + data = emalloc(sizeof(php_ssh2_listener_data)); + data->session = session; +- data->session_rsrcid = Z_LVAL_P(zsession); +- //TODO Sean-Der +- //zend_list_addref(data->session_rsrcid); ++ data->session_rsrc = Z_RES_P(zsession); ++ Z_ADDREF_P(zsession); + data->listener = listener; + + RETURN_RES(zend_register_resource(data, le_ssh2_listener)); +@@ -810,7 +809,7 @@ PHP_FUNCTION(ssh2_forward_accept) + channel_data->channel = channel; + channel_data->streamid = 0; + channel_data->is_blocking = 0; +- channel_data->session_rsrcid = data->session_rsrcid; ++ channel_data->session_rsrc = data->session_rsrc; + channel_data->refcount = NULL; + + stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+"); +@@ -820,8 +819,12 @@ PHP_FUNCTION(ssh2_forward_accept) + libssh2_channel_free(channel); + RETURN_FALSE; + } +- //TODO Sean-Der +- //zend_list_addref(channel_data->session_rsrcid); ++ ++#if PHP_VERSION_ID < 70300 ++ GC_REFCOUNT(channel_data->session_rsrc)++; ++#else ++ GC_ADDREF(channel_data->session_rsrc); ++#endif + + php_stream_to_zval(stream, return_value); + } +@@ -975,9 +978,8 @@ PHP_FUNCTION(ssh2_publickey_init) + + data = emalloc(sizeof(php_ssh2_pkey_subsys_data)); + data->session = session; +- data->session_rsrcid = Z_RES_P(zsession)->handle; +- //TODO Sean-Der +- //zend_list_addref(data->session_rsrcid); ++ data->session_rsrc = Z_RES_P(zsession); ++ Z_ADDREF_P(zsession); + data->pkey = pkey; + + RETURN_RES(zend_register_resource(data, le_ssh2_pkey_subsys)); +@@ -1280,8 +1282,7 @@ static void php_ssh2_listener_dtor(zend_resource *rsrc) + LIBSSH2_LISTENER *listener = data->listener; + + libssh2_channel_forward_cancel(listener); +- // TODO Sean-Der +- //zend_list_delete(data->session_rsrcid); ++ zend_list_delete(data->session_rsrc); + efree(data); + } + +@@ -1291,8 +1292,7 @@ static void php_ssh2_pkey_subsys_dtor(zend_resource *rsrc) + LIBSSH2_PUBLICKEY *pkey = data->pkey; + + libssh2_publickey_shutdown(pkey); +- // TODO Sean-Der +- //zend_list_delete(data->session_rsrcid); ++ zend_list_delete(data->session_rsrc); + efree(data); + } + +diff --git a/ssh2_fopen_wrappers.c b/ssh2_fopen_wrappers.c +index f2f3475..c4eb9dc 100644 +--- a/ssh2_fopen_wrappers.c ++++ b/ssh2_fopen_wrappers.c +@@ -47,11 +47,9 @@ static size_t php_ssh2_channel_stream_write(php_stream *stream, const char *buf, + php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract; + size_t writestate; + LIBSSH2_SESSION *session; +- zval *zresource; + + libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking); +- zresource = php_ssh2_zval_from_resource_handle(abstract->session_rsrcid); +- session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session); ++ session = (LIBSSH2_SESSION *)zend_fetch_resource(abstract->session_rsrc, PHP_SSH2_SESSION_RES_NAME, le_ssh2_session); + + + +@@ -90,12 +88,10 @@ static size_t php_ssh2_channel_stream_read(php_stream *stream, char *buf, size_t + php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract; + ssize_t readstate; + LIBSSH2_SESSION *session; +- zval *zresource; + + stream->eof = libssh2_channel_eof(abstract->channel); + libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking); +- zresource = php_ssh2_zval_from_resource_handle(abstract->session_rsrcid); +- session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session); ++ session = (LIBSSH2_SESSION *)zend_fetch_resource(abstract->session_rsrc, PHP_SSH2_SESSION_RES_NAME, le_ssh2_session); + + #ifdef PHP_SSH2_SESSION_TIMEOUT + if (abstract->is_blocking) { +@@ -137,8 +133,7 @@ static int php_ssh2_channel_stream_close(php_stream *stream, int close_handle) + } + libssh2_channel_eof(abstract->channel); + libssh2_channel_free(abstract->channel); +- //TODO Sean-Der +- //zend_list_delete(abstract->session_rsrcid); ++ zend_list_delete(abstract->session_rsrc); + } + efree(abstract); + +@@ -207,8 +202,8 @@ php_stream_ops php_ssh2_channel_stream_ops = { + * Parse an ssh2.*:// path + */ + php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stream_context *context, +- LIBSSH2_SESSION **psession, int *presource_id, +- LIBSSH2_SFTP **psftp, int *psftp_rsrcid) ++ LIBSSH2_SESSION **psession, zend_resource **presource, ++ LIBSSH2_SFTP **psftp, zend_resource **psftp_rsrc) + { + php_ssh2_sftp_data *sftp_data = NULL; + LIBSSH2_SESSION *session; +@@ -283,11 +278,10 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + sftp_data = (php_ssh2_sftp_data *)zend_fetch_resource(Z_RES_P(zresource), PHP_SSH2_SFTP_RES_NAME, le_ssh2_sftp); + if (sftp_data) { + /* Want the sftp layer */ +- //TODO Sean-Der +- //zend_list_addref(resource_id); +- *psftp_rsrcid = resource_id; ++ Z_ADDREF_P(zresource); ++ *psftp_rsrc = Z_RES_P(zresource); + *psftp = sftp_data->sftp; +- *presource_id = sftp_data->session_rsrcid; ++ *presource = sftp_data->session_rsrc; + *psession = sftp_data->session; + return resource; + } +@@ -305,18 +299,16 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + sftp_data = emalloc(sizeof(php_ssh2_sftp_data)); + sftp_data->sftp = sftp; + sftp_data->session = session; +- sftp_data->session_rsrcid = resource_id; +- //TODO Sean-Der +- //zend_list_addref(resource_id); +- *psftp_rsrcid = zend_register_resource(sftp_data, le_ssh2_sftp)->handle; ++ sftp_data->session_rsrc = Z_RES_P(zresource); ++ Z_ADDREF_P(zresource); ++ *psftp_rsrc = zend_register_resource(sftp_data, le_ssh2_sftp); + *psftp = sftp; +- *presource_id = resource_id; ++ *presource = Z_RES_P(zresource); + *psession = session; + return resource; + } +- //TODO Sean-Der +- //zend_list_addref(resource_id); +- *presource_id = resource_id; ++ Z_ADDREF_P(zresource); ++ *presource = Z_RES_P(zresource); + *psession = session; + return resource; + } +@@ -330,9 +322,9 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + sftp_data = (php_ssh2_sftp_data *)zend_fetch_resource(Z_RES_P(tmpzval), PHP_SSH2_SFTP_RES_NAME, le_ssh2_sftp); + if (sftp_data) { + Z_ADDREF_P(tmpzval); +- *psftp_rsrcid = Z_LVAL_P(tmpzval); ++ *psftp_rsrc = Z_RES_P(tmpzval); + *psftp = sftp_data->sftp; +- *presource_id = sftp_data->session_rsrcid; ++ *presource = sftp_data->session_rsrc; + *psession = sftp_data->session; + return resource; + } +@@ -354,17 +346,17 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + sftp_data = emalloc(sizeof(php_ssh2_sftp_data)); + sftp_data->sftp = sftp; + sftp_data->session = session; +- sftp_data->session_rsrcid = Z_LVAL_P(tmpzval); ++ sftp_data->session_rsrc = Z_RES_P(tmpzval); + Z_ADDREF_P(tmpzval); +- *psftp_rsrcid = zend_register_resource(sftp_data, le_ssh2_sftp)->handle; ++ *psftp_rsrc = zend_register_resource(sftp_data, le_ssh2_sftp); + *psftp = sftp; +- *presource_id = Z_RES_P(tmpzval)->handle; ++ *presource = Z_RES_P(tmpzval); + *psession = session; + return resource; + } + Z_ADDREF_P(tmpzval); + *psession = session; +- *presource_id = Z_LVAL_P(tmpzval); ++ *presource = Z_RES_P(tmpzval); + return resource; + } + } +@@ -465,8 +457,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + + /* Auth failure */ + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(Z_LVAL(zsession)); ++ zend_list_delete(Z_RES(zsession)); + return NULL; + + session_authed: +@@ -480,24 +471,22 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + sftp = libssh2_sftp_init(session); + if (!sftp) { + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(Z_LVAL(zsession)); ++ zend_list_delete(Z_RES(zsession)); + return NULL; + } + + sftp_data = emalloc(sizeof(php_ssh2_sftp_data)); + sftp_data->session = session; + sftp_data->sftp = sftp; +- sftp_data->session_rsrcid = Z_LVAL(zsession); ++ sftp_data->session_rsrc = Z_RES(zsession); + + //TODO Sean-Der + //ZEND_REGISTER_RESOURCE(sftp_data, le_ssh2_sftp); +- *psftp_rsrcid = Z_LVAL(zsftp); ++ *psftp_rsrc = Z_RES(zsftp); + *psftp = sftp; + } + +- //TODO may be undefined +- *presource_id = Z_LVAL(zsession); ++ *presource = Z_RES(zsession); + *psession = session; + + return resource; +@@ -511,7 +500,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + /* {{{ php_ssh2_shell_open + * Make a stream from a session + */ +-static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id, char *term, int term_len, zval *environment, long width, long height, long type) ++static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, zend_resource *resource, char *term, int term_len, zval *environment, long width, long height, long type) + { + LIBSSH2_CHANNEL *channel; + php_ssh2_channel_data *channel_data; +@@ -578,7 +567,7 @@ static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id + channel_data->streamid = 0; + channel_data->is_blocking = 0; + channel_data->timeout = 0; +- channel_data->session_rsrcid = resource_id; ++ channel_data->session_rsrc = resource; + channel_data->refcount = NULL; + + stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+"); +@@ -599,11 +588,12 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con + zend_long width = PHP_SSH2_DEFAULT_TERM_WIDTH; + zend_long height = PHP_SSH2_DEFAULT_TERM_HEIGHT; + zend_long type = PHP_SSH2_DEFAULT_TERM_UNIT; +- int resource_id = 0, terminal_len = sizeof(PHP_SSH2_DEFAULT_TERMINAL) - 1; ++ zend_resource *rsrc = NULL; ++ int terminal_len = sizeof(PHP_SSH2_DEFAULT_TERMINAL) - 1; + php_url *resource; + char *s; + +- resource = php_ssh2_fopen_wraper_parse_path(path, "shell", context, &session, &resource_id, NULL, NULL); ++ resource = php_ssh2_fopen_wraper_parse_path(path, "shell", context, &session, &rsrc, NULL, NULL); + if (!resource || !session) { + return NULL; + } +@@ -677,10 +667,9 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con + /* TODO: Accept resolution and environment vars as URL style parameters + * ssh2.shell://hostorresource/terminal/99x99c?envvar=envval&envvar=envval.... + */ +- stream = php_ssh2_shell_open(session, resource_id, terminal, terminal_len, environment, width, height, type); ++ stream = php_ssh2_shell_open(session, rsrc, terminal, terminal_len, environment, width, height, type); + if (!stream) { +- //TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + } + php_url_free(resource); + +@@ -730,7 +719,7 @@ PHP_FUNCTION(ssh2_shell) + + SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession); + +- stream = php_ssh2_shell_open(session, Z_RES_P(zsession)->handle, term, term_len, environment, width, height, type); ++ stream = php_ssh2_shell_open(session, Z_RES_P(zsession), term, term_len, environment, width, height, type); + if (!stream) { + RETURN_FALSE; + } +@@ -749,7 +738,7 @@ PHP_FUNCTION(ssh2_shell) + /* {{{ php_ssh2_exec_command + * Make a stream from a session + */ +-static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_id, char *command, char *term, int term_len, zval *environment, long width, long height, long type) ++static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, zend_resource *rsrc, char *command, char *term, int term_len, zval *environment, long width, long height, long type) + { + LIBSSH2_CHANNEL *channel; + php_ssh2_channel_data *channel_data; +@@ -819,7 +808,7 @@ static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_ + channel_data->streamid = 0; + channel_data->is_blocking = 0; + channel_data->timeout = 0; +- channel_data->session_rsrcid = resource_id; ++ channel_data->session_rsrc = rsrc; + channel_data->refcount = NULL; + + stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+"); +@@ -836,7 +825,7 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons + LIBSSH2_SESSION *session = NULL; + php_stream *stream; + zval *tmpzval, *environment = NULL; +- int resource_id = 0; ++ zend_resource *rsrc = NULL; + php_url *resource; + char *terminal = NULL; + int terminal_len = 0; +@@ -844,14 +833,13 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons + long height = PHP_SSH2_DEFAULT_TERM_HEIGHT; + long type = PHP_SSH2_DEFAULT_TERM_UNIT; + +- resource = php_ssh2_fopen_wraper_parse_path(path, "exec", context, &session, &resource_id, NULL, NULL); ++ resource = php_ssh2_fopen_wraper_parse_path(path, "exec", context, &session, &rsrc, NULL, NULL); + if (!resource || !session) { + return NULL; + } + if (!resource->path) { + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + return NULL; + } + +@@ -893,10 +881,9 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons + zval_ptr_dtor(copyval); + } + +- stream = php_ssh2_exec_command(session, resource_id, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type); ++ stream = php_ssh2_exec_command(session, rsrc, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type); + if (!stream) { +- // TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + } + php_url_free(resource); + +@@ -963,7 +950,7 @@ PHP_FUNCTION(ssh2_exec) + + SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession); + +- stream = php_ssh2_exec_command(session, Z_RES_P(zsession)->handle, command, term, term_len, environment, width, height, type); ++ stream = php_ssh2_exec_command(session, Z_RES_P(zsession), command, term, term_len, environment, width, height, type); + if (!stream) { + RETURN_FALSE; + } +@@ -982,7 +969,7 @@ PHP_FUNCTION(ssh2_exec) + /* {{{ php_ssh2_scp_xfer + * Make a stream from a session + */ +-static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, int resource_id, char *filename) ++static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, zend_resource *rsrc, char *filename) + { + LIBSSH2_CHANNEL *channel; + php_ssh2_channel_data *channel_data; +@@ -1002,7 +989,7 @@ static php_stream *php_ssh2_scp_xfer(LIBSSH2_SESSION *session, int resource_id, + channel_data->streamid = 0; + channel_data->is_blocking = 0; + channel_data->timeout = 0; +- channel_data->session_rsrcid = resource_id; ++ channel_data->session_rsrc = rsrc; + channel_data->refcount = NULL; + + stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r"); +@@ -1018,28 +1005,26 @@ static php_stream *php_ssh2_fopen_wrapper_scp(php_stream_wrapper *wrapper, const + { + LIBSSH2_SESSION *session = NULL; + php_stream *stream; +- int resource_id = 0; ++ zend_resource *rsrc = NULL; + php_url *resource; + + if (strchr(mode, '+') || strchr(mode, 'a') || strchr(mode, 'w')) { + return NULL; + } + +- resource = php_ssh2_fopen_wraper_parse_path(path, "scp", context, &session, &resource_id, NULL, NULL); ++ resource = php_ssh2_fopen_wraper_parse_path(path, "scp", context, &session, &rsrc, NULL, NULL); + if (!resource || !session) { + return NULL; + } + if (!resource->path) { + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + return NULL; + } + +- stream = php_ssh2_scp_xfer(session, resource_id, SSH2_URL_STR(resource->path)); ++ stream = php_ssh2_scp_xfer(session, rsrc, SSH2_URL_STR(resource->path)); + if (!stream) { +- //TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + } + php_url_free(resource); + +@@ -1231,7 +1216,7 @@ PHP_FUNCTION(ssh2_scp_send) + /* {{{ php_ssh2_direct_tcpip + * Make a stream from a session + */ +-static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, int resource_id, char *host, int port) ++static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, zend_resource *rsrc, char *host, int port) + { + LIBSSH2_CHANNEL *channel; + php_ssh2_channel_data *channel_data; +@@ -1251,7 +1236,7 @@ static php_stream *php_ssh2_direct_tcpip(LIBSSH2_SESSION *session, int resource_ + channel_data->streamid = 0; + channel_data->is_blocking = 0; + channel_data->timeout = 0; +- channel_data->session_rsrcid = resource_id; ++ channel_data->session_rsrc = rsrc; + channel_data->refcount = NULL; + + stream = php_stream_alloc(&php_ssh2_channel_stream_ops, channel_data, 0, "r+"); +@@ -1270,9 +1255,9 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co + php_url *resource; + char *host = NULL; + int port = 0; +- int resource_id = 0; ++ zend_resource *rsrc; + +- resource = php_ssh2_fopen_wraper_parse_path(path, "tunnel", context, &session, &resource_id, NULL, NULL); ++ resource = php_ssh2_fopen_wraper_parse_path(path, "tunnel", context, &session, &rsrc, NULL, NULL); + if (!resource || !session) { + return NULL; + } +@@ -1303,15 +1288,13 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co + if ((port <= 0) || (port > 65535) || !host || (strlen(host) == 0)) { + /* Invalid connection criteria */ + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + return NULL; + } + +- stream = php_ssh2_direct_tcpip(session, resource_id, host, port); ++ stream = php_ssh2_direct_tcpip(session, rsrc, host, port); + if (!stream) { +- // TODO Sean-Der +- //zend_list_delete(resource_id); ++ zend_list_delete(rsrc); + } + php_url_free(resource); + +@@ -1352,7 +1335,7 @@ PHP_FUNCTION(ssh2_tunnel) + + SSH2_FETCH_AUTHENTICATED_SESSION(session, zsession); + +- stream = php_ssh2_direct_tcpip(session, Z_RES_P(zsession)->handle, host, port); ++ stream = php_ssh2_direct_tcpip(session, Z_RES_P(zsession), host, port); + if (!stream) { + RETURN_FALSE; + } +diff --git a/ssh2_sftp.c b/ssh2_sftp.c +index 6332be8..256fc70 100644 +--- a/ssh2_sftp.c ++++ b/ssh2_sftp.c +@@ -40,8 +40,7 @@ void php_ssh2_sftp_dtor(zend_resource *rsrc) + + libssh2_sftp_shutdown(data->sftp); + +- // TODO Sean-Der +- //zend_list_delete(data->session_rsrcid); ++ zend_list_delete(data->session_rsrc); + + efree(data); + } +@@ -50,7 +49,7 @@ void php_ssh2_sftp_dtor(zend_resource *rsrc) + * SFTP File Ops * + ***************** */ + +-inline unsigned long php_ssh2_parse_fopen_modes(char *openmode) { ++unsigned long php_ssh2_parse_fopen_modes(char *openmode) { + unsigned long flags = 0; + + if (strchr(openmode, 'a')) { +@@ -101,7 +100,7 @@ inline int php_ssh2_sftp_attr2ssb(php_stream_statbuf *ssb, LIBSSH2_SFTP_ATTRIBUT + typedef struct _php_ssh2_sftp_handle_data { + LIBSSH2_SFTP_HANDLE *handle; + +- long sftp_rsrcid; ++ zend_resource *sftp_rsrc; + } php_ssh2_sftp_handle_data; + + /* {{{ php_ssh2_sftp_stream_write +@@ -139,8 +138,7 @@ static int php_ssh2_sftp_stream_close(php_stream *stream, int close_handle) + php_ssh2_sftp_handle_data *data = (php_ssh2_sftp_handle_data*)stream->abstract; + + libssh2_sftp_close(data->handle); +- //TODO Sean-Der +- //zend_list_delete(data->sftp_rsrcid); ++ zend_list_delete(data->sftp_rsrc); + efree(data); + + return 0; +@@ -226,12 +224,12 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons + LIBSSH2_SFTP *sftp = NULL; + LIBSSH2_SFTP_HANDLE *handle; + php_stream *stream; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource; + unsigned long flags; + long perms = 0644; + +- resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp) { + return NULL; + } +@@ -242,20 +240,18 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons + if (!handle) { + php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename); + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(sftp_rsrcid); ++ zend_list_delete(sftp_rsrc); + return NULL; + } + + data = emalloc(sizeof(php_ssh2_sftp_handle_data)); + data->handle = handle; +- data->sftp_rsrcid = sftp_rsrcid; ++ data->sftp_rsrc = sftp_rsrc; + + stream = php_stream_alloc(&php_ssh2_sftp_stream_ops, data, 0, mode); + if (!stream) { + libssh2_sftp_close(handle); +- // TODO Sean-Der +- //zend_list_delete(sftp_rsrcid); ++ zend_list_delete(sftp_rsrc); + efree(data); + } + php_url_free(resource); +@@ -303,8 +299,7 @@ static int php_ssh2_sftp_dirstream_close(php_stream *stream, int close_handle) + php_ssh2_sftp_handle_data *data = (php_ssh2_sftp_handle_data*)stream->abstract; + + libssh2_sftp_close(data->handle); +- //TODO Sean_der +- //zend_list_delete(data->sftp_rsrcid); ++ zend_list_delete(data->sftp_rsrc); + efree(data); + + return 0; +@@ -333,10 +328,10 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c + LIBSSH2_SFTP *sftp = NULL; + LIBSSH2_SFTP_HANDLE *handle; + php_stream *stream; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource; + +- resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(filename, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp) { + return NULL; + } +@@ -345,20 +340,18 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c + if (!handle) { + php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename); + php_url_free(resource); +- //TODO Sean-Der +- //zend_list_delete(sftp_rsrcid); ++ zend_list_delete(sftp_rsrc); + return NULL; + } + + data = emalloc(sizeof(php_ssh2_sftp_handle_data)); + data->handle = handle; +- data->sftp_rsrcid = sftp_rsrcid; ++ data->sftp_rsrc = sftp_rsrc; + + stream = php_stream_alloc(&php_ssh2_sftp_dirstream_ops, data, 0, mode); + if (!stream) { + libssh2_sftp_close(handle); +- //TODO Sean-Der +- //zend_list_delete(sftp_rsrcid); ++ zend_list_delete(sftp_rsrc); + efree(data); + } + php_url_free(resource); +@@ -378,10 +371,10 @@ static int php_ssh2_sftp_urlstat(php_stream_wrapper *wrapper, const char *url, i + LIBSSH2_SFTP_ATTRIBUTES attrs; + LIBSSH2_SESSION *session = NULL; + LIBSSH2_SFTP *sftp = NULL; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource; + +- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp || !resource->path) { + return -1; + } +@@ -408,11 +401,11 @@ static int php_ssh2_sftp_unlink(php_stream_wrapper *wrapper, const char *url, in + { + LIBSSH2_SESSION *session = NULL; + LIBSSH2_SFTP *sftp = NULL; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource; + int result; + +- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp || !resource->path) { + if (resource) { + php_url_free(resource); +@@ -436,7 +429,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro + { + LIBSSH2_SESSION *session = NULL; + LIBSSH2_SFTP *sftp = NULL; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource, *resource_to; + int result; + +@@ -453,7 +446,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro + return 0; + } + +- resource = php_ssh2_fopen_wraper_parse_path(url_from, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(url_from, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp || !resource->path) { + if (resource) { + php_url_free(resource); +@@ -479,11 +472,11 @@ static int php_ssh2_sftp_mkdir(php_stream_wrapper *wrapper, const char *url, int + { + LIBSSH2_SESSION *session = NULL; + LIBSSH2_SFTP *sftp = NULL; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource; + int result; + +- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp || !resource->path) { + if (resource) { + php_url_free(resource); +@@ -515,11 +508,11 @@ static int php_ssh2_sftp_rmdir(php_stream_wrapper *wrapper, const char *url, int + { + LIBSSH2_SESSION *session = NULL; + LIBSSH2_SFTP *sftp = NULL; +- int resource_id = 0, sftp_rsrcid = 0; ++ zend_resource *rsrc = NULL, *sftp_rsrc = NULL; + php_url *resource; + int result; + +- resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &resource_id, &sftp, &sftp_rsrcid); ++ resource = php_ssh2_fopen_wraper_parse_path(url, "sftp", context, &session, &rsrc, &sftp, &sftp_rsrc); + if (!resource || !session || !sftp || !resource->path) { + if (resource) { + php_url_free(resource); +@@ -591,7 +584,7 @@ PHP_FUNCTION(ssh2_sftp) + data = emalloc(sizeof(php_ssh2_sftp_data)); + data->session = session; + data->sftp = sftp; +- data->session_rsrcid = Z_RES_P(zsession)->handle; ++ data->session_rsrc = Z_RES_P(zsession); + Z_ADDREF_P(zsession); + + RETURN_RES(zend_register_resource(data, le_ssh2_sftp)); diff --git a/PHPINFO b/PHPINFO new file mode 100644 index 0000000..efa5ebd --- /dev/null +++ b/PHPINFO @@ -0,0 +1,7 @@ + +ssh2 + +SSH2 support => enabled +extension version => 1.1.2 +libssh2 version => 1.8.0 +banner => SSH-2.0-libssh2_1.8.0 diff --git a/REFLECTION b/REFLECTION index 1f3a38e..945e2dc 100644 --- a/REFLECTION +++ b/REFLECTION @@ -1,4 +1,4 @@ -Extension [ extension #133 ssh2 version 1.1.2 ] { +Extension [ extension #143 ssh2 version 1.1.2 ] { - Constants [21] { Constant [ integer SSH2_FINGERPRINT_MD5 ] { 0 } diff --git a/a8835aab2c15e794fce13bd927295719e384ad2d.patch b/a8835aab2c15e794fce13bd927295719e384ad2d.patch new file mode 100644 index 0000000..eb4c967 --- /dev/null +++ b/a8835aab2c15e794fce13bd927295719e384ad2d.patch @@ -0,0 +1,299 @@ +From a8835aab2c15e794fce13bd927295719e384ad2d Mon Sep 17 00:00:00 2001 +From: Remi Collet +Date: Thu, 28 Jun 2018 07:10:35 +0200 +Subject: [PATCH] fix php_url fields usage for PHP 7.3 + +--- + php_ssh2.h | 8 ++++++++ + ssh2_fopen_wrappers.c | 55 ++++++++++++++++++++++++++++++++------------------- + ssh2_sftp.c | 20 +++++++++---------- + 3 files changed, 53 insertions(+), 30 deletions(-) + +diff --git a/php_ssh2.h b/php_ssh2.h +index 734b795..d010ff9 100644 +--- a/php_ssh2.h ++++ b/php_ssh2.h +@@ -166,6 +166,14 @@ extern php_stream_wrapper php_ssh2_sftp_wrapper; + extern int le_ssh2_session; + extern int le_ssh2_sftp; + ++#if PHP_VERSION_ID < 70300 ++#define SSH2_URL_STR(a) (a) ++#define SSH2_URL_LEN(a) strlen(a) ++#else ++#define SSH2_URL_STR(a) ZSTR_VAL(a) ++#define SSH2_URL_LEN(a) ZSTR_LEN(a) ++#endif ++ + #endif /* PHP_SSH2_H */ + + /* +diff --git a/ssh2_fopen_wrappers.c b/ssh2_fopen_wrappers.c +index 2f96ca4..f2f3475 100644 +--- a/ssh2_fopen_wrappers.c ++++ b/ssh2_fopen_wrappers.c +@@ -215,7 +215,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + php_url *resource; + zval *methods = NULL, *callbacks = NULL, zsession, *tmpzval; + zend_long resource_id; +- char *h, *s, *username = NULL, *password = NULL, *pubkey_file = NULL, *privkey_file = NULL; ++ char *h, *username = NULL, *password = NULL, *pubkey_file = NULL, *privkey_file = NULL; + int username_len = 0, password_len = 0; + + h = strstr(path, "Resource id #"); +@@ -233,13 +233,13 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + return NULL; + } + +- if (strncmp(resource->scheme, "ssh2.", sizeof("ssh2.") - 1)) { ++ if (strncmp(SSH2_URL_STR(resource->scheme), "ssh2.", sizeof("ssh2.") - 1)) { + /* Not an ssh wrapper */ + php_url_free(resource); + return NULL; + } + +- if (strcmp(resource->scheme + sizeof("ssh2.") - 1, type)) { ++ if (strcmp(SSH2_URL_STR(resource->scheme) + sizeof("ssh2.") - 1, type)) { + /* Wrong ssh2. wrapper type */ + php_url_free(resource); + return NULL; +@@ -253,13 +253,27 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + Find resource->path in the path string, then copy the entire string from the original path. + This includes ?query#fragment in the path string + */ ++// TODO copy seems uneeded ++#if PHP_VERSION_ID < 70300 ++ { ++ char * s; ++ + s = resource->path; + resource->path = estrdup(strstr(path, resource->path)); + efree(s); ++ } ++#else ++ { ++ zend_string *tmp; ++ ++ tmp = resource->path; ++ resource->path = zend_string_init(ZSTR_VAL(resource->path), ZSTR_LEN(resource->path), 0); ++ zend_string_release(tmp); ++ } ++#endif + + /* Look for a resource ID to reuse a session */ +- s = resource->host; +- if (is_numeric_string(s, strlen(s), &resource_id, NULL, 0) == IS_LONG) { ++ if (is_numeric_string(SSH2_URL_STR(resource->host), SSH2_URL_LEN(resource->host), &resource_id, NULL, 0) == IS_LONG) { + php_ssh2_sftp_data *sftp_data; + zval *zresource; + +@@ -309,7 +323,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + } + + /* Fallback on finding it in the context */ +- if (resource->host[0] == 0 && context && psftp && ++ if (SSH2_URL_STR(resource->host)[0] == 0 && context && psftp && + (tmpzval = php_stream_context_get_option(context, "ssh2", "sftp")) != NULL && + Z_TYPE_P(tmpzval) == IS_RESOURCE) { + php_ssh2_sftp_data *sftp_data; +@@ -323,7 +337,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + return resource; + } + } +- if (resource->host[0] == 0 && context && ++ if (SSH2_URL_STR(resource->host)[0] == 0 && context && + (tmpzval = php_stream_context_get_option(context, "ssh2", "session")) != NULL && + Z_TYPE_P(tmpzval) == IS_RESOURCE) { + session = (LIBSSH2_SESSION *)zend_fetch_resource(Z_RES_P(tmpzval), PHP_SSH2_SESSION_RES_NAME, le_ssh2_session); +@@ -399,19 +413,19 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + } + + if (resource->user) { +- int len = strlen(resource->user); ++ int len = SSH2_URL_LEN(resource->user); + + if (len) { +- username = resource->user; ++ username = SSH2_URL_STR(resource->user); + username_len = len; + } + } + + if (resource->pass) { +- int len = strlen(resource->pass); ++ int len = SSH2_URL_LEN(resource->pass); + + if (len) { +- password = resource->pass; ++ password = SSH2_URL_STR(resource->pass); + password_len = len; + } + } +@@ -422,7 +436,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + return NULL; + } + +- session = php_ssh2_session_connect(resource->host, resource->port, methods, callbacks); ++ session = php_ssh2_session_connect(SSH2_URL_STR(resource->host), resource->port, methods, callbacks); + if (!session) { + /* Unable to connect! */ + php_url_free(resource); +@@ -482,6 +496,7 @@ php_url *php_ssh2_fopen_wraper_parse_path(const char *path, char *type, php_stre + *psftp = sftp; + } + ++ //TODO may be undefined + *presource_id = Z_LVAL(zsession); + *psession = session; + +@@ -527,7 +542,7 @@ static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id + zval_copy_ctor(©val); + convert_to_string(©val); + if (libssh2_channel_setenv_ex(channel, key->val, key->len, Z_STRVAL(copyval), Z_STRLEN(copyval))) { +- php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", key, Z_STRVAL(copyval)); ++ php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", ZSTR_VAL(key), Z_STRVAL(copyval)); + } + zval_dtor(©val); + } +@@ -631,7 +646,7 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con + zval_ptr_dtor(©val); + } + +- s = resource->path ? resource->path : NULL; ++ s = resource->path ? SSH2_URL_STR(resource->path) : NULL; + + if (s && s[0] == '/') { + /* Terminal type encoded into URL overrides context terminal type */ +@@ -766,7 +781,7 @@ static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_ + zval_copy_ctor(©val); + convert_to_string(©val); + if (libssh2_channel_setenv_ex(channel, key->val, key->len, Z_STRVAL(copyval), Z_STRLEN(copyval))) { +- php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", key, Z_STRVAL(copyval)); ++ php_error_docref(NULL, E_WARNING, "Failed setting %s=%s on remote end", ZSTR_VAL(key), Z_STRVAL(copyval)); + } + zval_dtor(©val); + } +@@ -878,7 +893,7 @@ static php_stream *php_ssh2_fopen_wrapper_exec(php_stream_wrapper *wrapper, cons + zval_ptr_dtor(copyval); + } + +- stream = php_ssh2_exec_command(session, resource_id, resource->path + 1, terminal, terminal_len, environment, width, height, type); ++ stream = php_ssh2_exec_command(session, resource_id, SSH2_URL_STR(resource->path) + 1, terminal, terminal_len, environment, width, height, type); + if (!stream) { + // TODO Sean-Der + //zend_list_delete(resource_id); +@@ -1021,7 +1036,7 @@ static php_stream *php_ssh2_fopen_wrapper_scp(php_stream_wrapper *wrapper, const + return NULL; + } + +- stream = php_ssh2_scp_xfer(session, resource_id, resource->path); ++ stream = php_ssh2_scp_xfer(session, resource_id, SSH2_URL_STR(resource->path)); + if (!stream) { + //TODO Sean-Der + //zend_list_delete(resource_id); +@@ -1147,7 +1162,7 @@ PHP_FUNCTION(ssh2_scp_send) + char *error_msg = NULL; + + last_error = libssh2_session_last_error(session, &error_msg, NULL, 0); +- php_error_docref(NULL, E_WARNING, "Failure creating remote file: %s", error_msg); ++ php_error_docref(NULL, E_WARNING, "Failure creating remote file: %s (%d)", error_msg, last_error); + php_stream_close(local_file); + RETURN_FALSE; + } +@@ -1262,10 +1277,10 @@ static php_stream *php_ssh2_fopen_wrapper_tunnel(php_stream_wrapper *wrapper, co + return NULL; + } + +- if (resource->path && resource->path[0] == '/') { ++ if (resource->path && SSH2_URL_STR(resource->path)[0] == '/') { + char *colon; + +- host = resource->path + 1; ++ host = SSH2_URL_STR(resource->path) + 1; + if (*host == '[') { + /* IPv6 Encapsulated Format */ + host++; +diff --git a/ssh2_sftp.c b/ssh2_sftp.c +index 13f89f0..6332be8 100644 +--- a/ssh2_sftp.c ++++ b/ssh2_sftp.c +@@ -238,7 +238,7 @@ static php_stream *php_ssh2_sftp_stream_opener(php_stream_wrapper *wrapper, cons + + flags = php_ssh2_parse_fopen_modes((char *)mode); + +- handle = libssh2_sftp_open(sftp, resource->path, flags, perms); ++ handle = libssh2_sftp_open(sftp, SSH2_URL_STR(resource->path), flags, perms); + if (!handle) { + php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename); + php_url_free(resource); +@@ -341,7 +341,7 @@ static php_stream *php_ssh2_sftp_dirstream_opener(php_stream_wrapper *wrapper, c + return NULL; + } + +- handle = libssh2_sftp_opendir(sftp, resource->path); ++ handle = libssh2_sftp_opendir(sftp, SSH2_URL_STR(resource->path)); + if (!handle) { + php_error_docref(NULL, E_WARNING, "Unable to open %s on remote host", filename); + php_url_free(resource); +@@ -386,7 +386,7 @@ static int php_ssh2_sftp_urlstat(php_stream_wrapper *wrapper, const char *url, i + return -1; + } + +- if (libssh2_sftp_stat_ex(sftp, resource->path, strlen(resource->path), ++ if (libssh2_sftp_stat_ex(sftp, SSH2_URL_STR(resource->path), SSH2_URL_LEN(resource->path), + (flags & PHP_STREAM_URL_STAT_LINK) ? LIBSSH2_SFTP_LSTAT : LIBSSH2_SFTP_STAT, &attrs)) { + php_url_free(resource); + //zend_list_delete(sftp_rsrcid); +@@ -420,7 +420,7 @@ static int php_ssh2_sftp_unlink(php_stream_wrapper *wrapper, const char *url, in + return 0; + } + +- result = libssh2_sftp_unlink(sftp, resource->path); ++ result = libssh2_sftp_unlink(sftp, SSH2_URL_STR(resource->path)); + php_url_free(resource); + + //zend_list_delete(sftp_rsrcid); +@@ -462,7 +462,7 @@ static int php_ssh2_sftp_rename(php_stream_wrapper *wrapper, const char *url_fro + return 0; + } + +- result = libssh2_sftp_rename(sftp, resource->path, resource_to->path); ++ result = libssh2_sftp_rename(sftp, SSH2_URL_STR(resource->path), SSH2_URL_STR(resource_to->path)); + php_url_free(resource); + php_url_free(resource_to); + +@@ -493,13 +493,13 @@ static int php_ssh2_sftp_mkdir(php_stream_wrapper *wrapper, const char *url, int + + if (options & PHP_STREAM_MKDIR_RECURSIVE) { + /* Just attempt to make every directory, some will fail, but we only care about the last success/failure */ +- char *p = resource->path; ++ char *p = SSH2_URL_STR(resource->path); + while ((p = strchr(p + 1, '/'))) { +- libssh2_sftp_mkdir_ex(sftp, resource->path, p - resource->path, mode); ++ libssh2_sftp_mkdir_ex(sftp, SSH2_URL_STR(resource->path), p - SSH2_URL_STR(resource->path), mode); + } + } + +- result = libssh2_sftp_mkdir(sftp, resource->path, mode); ++ result = libssh2_sftp_mkdir(sftp, SSH2_URL_STR(resource->path), mode); + php_url_free(resource); + + //zend_list_delete(sftp_rsrcid); +@@ -527,7 +527,7 @@ static int php_ssh2_sftp_rmdir(php_stream_wrapper *wrapper, const char *url, int + return 0; + } + +- result = libssh2_sftp_rmdir(sftp, resource->path); ++ result = libssh2_sftp_rmdir(sftp, SSH2_URL_STR(resource->path)); + php_url_free(resource); + + //zend_list_delete(sftp_rsrcid); +@@ -836,7 +836,7 @@ PHP_FUNCTION(ssh2_sftp_readlink) + } + + if ((targ_len = libssh2_sftp_symlink_ex(data->sftp, link->val, link->len, targ, 8192, LIBSSH2_SFTP_READLINK)) < 0) { +- php_error_docref(NULL, E_WARNING, "Unable to read link '%s'", link); ++ php_error_docref(NULL, E_WARNING, "Unable to read link '%s'", ZSTR_VAL(link)); + RETURN_FALSE; + } + diff --git a/php-pecl-ssh2.spec b/php-pecl-ssh2.spec index 3096a0a..c520958 100644 --- a/php-pecl-ssh2.spec +++ b/php-pecl-ssh2.spec @@ -1,7 +1,7 @@ # remirepo spec file for php-pecl-ssh2 # with SCL compatibility # -# Copyright (c) 2011-2017 Remi Collet +# Copyright (c) 2011-2018 Remi Collet # # Fedora spec file for php-pecl-ssh2 # @@ -30,7 +30,7 @@ Version: 1.1.2 Release: 0.3.%{gh_date}git%{gh_short}%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/%{gh_commit}/%{gh_project}-%{version}%{?prever}-%{gh_short}.tar.gz %else -Release: 1%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +Release: 2%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} Source0: http://pecl.php.net/get/%{pecl_name}-%{version}.tgz %endif Summary: Bindings for the libssh2 library @@ -38,10 +38,13 @@ Summary: Bindings for the libssh2 library %global buildver %(pkg-config --silence-errors --modversion libssh2 2>/dev/null || echo 65536) License: PHP -Group: Development/Languages URL: http://pecl.php.net/package/%{pecl_name} +Patch0: https://github.com/php/pecl-networking-ssh2/commit/a8835aab2c15e794fce13bd927295719e384ad2d.patch +Patch1: https://github.com/php/pecl-networking-ssh2/commit/073067ba96ac99ed5696d27f13ca6c8124986e74.patch + BuildRequires: libssh2-devel >= 1.2 +BuildRequires: %{?dtsprefix}gcc BuildRequires: %{?scl_prefix}php-devel > 7 BuildRequires: %{?scl_prefix}php-pear @@ -119,6 +122,9 @@ sed -e 's/role="test"/role="src"/' \ -i package.xml cd NTS +%patch0 -p1 -b .up0 +%patch1 -p1 -b .up1 + extver=$(sed -n '/#define PHP_SSH2_VERSION/{s/.*\t"//;s/".*$//;p}' php_ssh2.h) if test "x${extver}" != "x%{version}%{?gh_date:-dev}"; then : Error: Upstream version is now ${extver}, expecting %{version}%{?gh_date:-dev}. @@ -193,7 +199,7 @@ done %endif -%if 0%{?fedora} < 24 +%if 0%{?fedora} < 24 && 0%{?rhel} < 8 # when pear installed alone, after us %triggerin -- %{?scl_prefix}php-pear if [ -x %{__pecl} ] ; then @@ -231,6 +237,9 @@ fi %changelog +* Thu Jun 28 2018 Remi Collet - 1.1.2-2 +- add upstream patches for 7.3 + * Tue Aug 1 2017 Remi Collet - 1.1.2-1 - Update to 1.1.2 (alpha, no change) -- cgit