| From a8835aab2c15e794fce13bd927295719e384ad2d Mon Sep 17 00:00:00 2001 |
| From: Remi Collet <remi@php.net> |
| Date: Thu, 28 Jun 2018 07:10:35 +0200 |
| Subject: [PATCH] fix php_url fields usage for PHP 7.3 |
| |
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |
| [Retrieved from: |
| https://github.com/php/pecl-networking-ssh2/commit/a8835aab2c15e794fce13bd927295719e384ad2d] |
| --- |
| 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; |
| } |
| |