Skip to content

Commit

Permalink
fix php_url fields usage for PHP 7.3
Browse files Browse the repository at this point in the history
  • Loading branch information
remicollet committed Jun 28, 2018
1 parent 3ef81d9 commit a8835aa
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 30 deletions.
8 changes: 8 additions & 0 deletions php_ssh2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

/*
Expand Down
55 changes: 35 additions & 20 deletions ssh2_fopen_wrappers.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 #");
Expand All @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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;
}
}
Expand All @@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -527,7 +542,7 @@ static php_stream *php_ssh2_shell_open(LIBSSH2_SESSION *session, int resource_id
zval_copy_ctor(&copyval);
convert_to_string(&copyval);
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(&copyval);
}
Expand Down Expand Up @@ -631,7 +646,7 @@ static php_stream *php_ssh2_fopen_wrapper_shell(php_stream_wrapper *wrapper, con
zval_ptr_dtor(&copyval);
}

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 */
Expand Down Expand Up @@ -766,7 +781,7 @@ static php_stream *php_ssh2_exec_command(LIBSSH2_SESSION *session, int resource_
zval_copy_ctor(&copyval);
convert_to_string(&copyval);
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(&copyval);
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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++;
Expand Down
20 changes: 10 additions & 10 deletions ssh2_sftp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit a8835aa

Please sign in to comment.