mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix GH-9348: FTP & SSL session reuse
This commit is contained in:
commit
addb6e463a
3 changed files with 28 additions and 3 deletions
3
NEWS
3
NEWS
|
@ -14,6 +14,9 @@ PHP NEWS
|
||||||
. Fixed bug GH-12705 (Segmentation fault in fpm_status_export_to_zval).
|
. Fixed bug GH-12705 (Segmentation fault in fpm_status_export_to_zval).
|
||||||
(Patrick Prasse)
|
(Patrick Prasse)
|
||||||
|
|
||||||
|
- FTP:
|
||||||
|
. Fixed bug GH-9348 (FTP & SSL session reuse). (nielsdos)
|
||||||
|
|
||||||
- LibXML:
|
- LibXML:
|
||||||
. Fixed test failures for libxml2 2.12.0. (nielsdos)
|
. Fixed test failures for libxml2 2.12.0. (nielsdos)
|
||||||
|
|
||||||
|
|
|
@ -167,6 +167,9 @@ ftp_close(ftpbuf_t *ftp)
|
||||||
if (ftp == NULL) {
|
if (ftp == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (ftp->last_ssl_session) {
|
||||||
|
SSL_SESSION_free(ftp->last_ssl_session);
|
||||||
|
}
|
||||||
if (ftp->data) {
|
if (ftp->data) {
|
||||||
data_close(ftp, ftp->data);
|
data_close(ftp, ftp->data);
|
||||||
}
|
}
|
||||||
|
@ -229,6 +232,20 @@ ftp_quit(ftpbuf_t *ftp)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
static int ftp_ssl_new_session_cb(SSL *ssl, SSL_SESSION *sess)
|
||||||
|
{
|
||||||
|
ftpbuf_t *ftp = SSL_get_app_data(ssl);
|
||||||
|
|
||||||
|
/* Technically there can be multiple sessions per connection, but we only care about the most recent one. */
|
||||||
|
if (ftp->last_ssl_session) {
|
||||||
|
SSL_SESSION_free(ftp->last_ssl_session);
|
||||||
|
}
|
||||||
|
ftp->last_ssl_session = SSL_get1_session(ssl);
|
||||||
|
|
||||||
|
/* Return 0 as we are not using OpenSSL's session cache. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* {{{ ftp_login */
|
/* {{{ ftp_login */
|
||||||
int
|
int
|
||||||
ftp_login(ftpbuf_t *ftp, const char *user, const size_t user_len, const char *pass, const size_t pass_len)
|
ftp_login(ftpbuf_t *ftp, const char *user, const size_t user_len, const char *pass, const size_t pass_len)
|
||||||
|
@ -279,10 +296,13 @@ ftp_login(ftpbuf_t *ftp, const char *user, const size_t user_len, const char *pa
|
||||||
#endif
|
#endif
|
||||||
SSL_CTX_set_options(ctx, ssl_ctx_options);
|
SSL_CTX_set_options(ctx, ssl_ctx_options);
|
||||||
|
|
||||||
/* allow SSL to re-use sessions */
|
/* Allow SSL to re-use sessions.
|
||||||
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_BOTH);
|
* We're relying on our own session storage as only at most one session will ever be active per FTP connection. */
|
||||||
|
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_BOTH | SSL_SESS_CACHE_NO_INTERNAL);
|
||||||
|
SSL_CTX_sess_set_new_cb(ctx, ftp_ssl_new_session_cb);
|
||||||
|
|
||||||
ftp->ssl_handle = SSL_new(ctx);
|
ftp->ssl_handle = SSL_new(ctx);
|
||||||
|
SSL_set_app_data(ftp->ssl_handle, ftp); /* Needed for ftp_ssl_new_session_cb */
|
||||||
SSL_CTX_free(ctx);
|
SSL_CTX_free(ctx);
|
||||||
|
|
||||||
if (ftp->ssl_handle == NULL) {
|
if (ftp->ssl_handle == NULL) {
|
||||||
|
@ -1789,7 +1809,7 @@ data_accepted:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the session from the control connection so we can re-use it */
|
/* get the session from the control connection so we can re-use it */
|
||||||
session = SSL_get_session(ftp->ssl_handle);
|
session = ftp->last_ssl_session;
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
php_error_docref(NULL, E_WARNING, "data_accept: failed to retrieve the existing SSL session");
|
php_error_docref(NULL, E_WARNING, "data_accept: failed to retrieve the existing SSL session");
|
||||||
SSL_free(data->ssl_handle);
|
SSL_free(data->ssl_handle);
|
||||||
|
@ -1797,6 +1817,7 @@ data_accepted:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* and set it on the data connection */
|
/* and set it on the data connection */
|
||||||
|
SSL_set_app_data(data->ssl_handle, ftp); /* Needed for ftp_ssl_new_session_cb */
|
||||||
res = SSL_set_session(data->ssl_handle, session);
|
res = SSL_set_session(data->ssl_handle, session);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
php_error_docref(NULL, E_WARNING, "data_accept: failed to set the existing SSL session");
|
php_error_docref(NULL, E_WARNING, "data_accept: failed to set the existing SSL session");
|
||||||
|
|
|
@ -82,6 +82,7 @@ typedef struct ftpbuf
|
||||||
int old_ssl; /* old mode = forced data encryption */
|
int old_ssl; /* old mode = forced data encryption */
|
||||||
SSL *ssl_handle; /* handle for control connection */
|
SSL *ssl_handle; /* handle for control connection */
|
||||||
int ssl_active; /* ssl active on control conn */
|
int ssl_active; /* ssl active on control conn */
|
||||||
|
SSL_SESSION *last_ssl_session; /* last negotiated session */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} ftpbuf_t;
|
} ftpbuf_t;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue