Author: kotkov
Date: Tue Apr 25 08:49:22 2023
New Revision: 1909397
URL: http://svn.apache.org/viewvc?rev=1909397&view=rev
Log:
On the '1.3.x-r1902208+r1902304' branch: Merge r1902208, r1902304 from trunk:
- r1902208: Add support for BIO_CTRL_EOF, which is being used by OpenSSL 3.0+
and OpenSSL 1.1.1e.
- r1902304: Fix the return value for unknown controls in the BIO control
functions.
Resolve the conflicts and adjust the change to the state of the 1.3.x branch.
Modified:
serf/branches/1.3.x-r1902208+r1902304/ (props changed)
serf/branches/1.3.x-r1902208+r1902304/buckets/ssl_buckets.c
serf/branches/1.3.x-r1902208+r1902304/test/server/test_server.h
serf/branches/1.3.x-r1902208+r1902304/test/server/test_sslserver.c
Propchange: serf/branches/1.3.x-r1902208+r1902304/
------------------------------------------------------------------------------
Merged /serf/trunk:r1902208,1902304
Modified: serf/branches/1.3.x-r1902208+r1902304/buckets/ssl_buckets.c
URL:
http://svn.apache.org/viewvc/serf/branches/1.3.x-r1902208%2Br1902304/buckets/ssl_buckets.c?rev=1909397&r1=1909396&r2=1909397&view=diff
==============================================================================
--- serf/branches/1.3.x-r1902208+r1902304/buckets/ssl_buckets.c (original)
+++ serf/branches/1.3.x-r1902208+r1902304/buckets/ssl_buckets.c Tue Apr 25
08:49:22 2023
@@ -176,6 +176,10 @@ struct serf_ssl_context_t {
/* Status of a fatal error, returned on subsequent encrypt or decrypt
requests. */
apr_status_t fatal_err;
+
+ /* OpenSSL 1.1.1e introduced BIO_FLAGS_IN_EOF, but we implement
+ our own hit eof to support versions < 1.1.1e. */
+ int hit_eof;
};
typedef struct {
@@ -284,6 +288,10 @@ static int bio_bucket_read(BIO *bio, cha
serf__log(SSL_VERBOSE, __FILE__, "bio_bucket_read received %d bytes
(%d)\n",
len, status);
+ if (APR_STATUS_IS_EOF(status)) {
+ ctx->hit_eof = 1;
+ }
+
if (!SERF_BUCKET_READ_ERROR(status)) {
/* Oh suck. */
if (len) {
@@ -407,21 +415,43 @@ static int bio_bucket_destroy(BIO *bio)
static long bio_bucket_ctrl(BIO *bio, int cmd, long num, void *ptr)
{
- long ret = 1;
+ serf_ssl_context_t *ctx = bio_get_data(bio);
switch (cmd) {
+ case BIO_CTRL_FLUSH:
+ /* At this point we can't force a flush. */
+ return 1;
+ case BIO_CTRL_PUSH:
+ case BIO_CTRL_POP:
+ return 0;
+ case BIO_CTRL_EOF:
+ return ctx->hit_eof;
default:
/* abort(); */
- break;
+ return 0;
+ }
+}
+
+static long bio_file_ctrl(BIO *bio, int cmd, long num, void *ptr)
+{
+ apr_file_t *file = bio_get_data(bio);
+
+ switch (cmd) {
case BIO_CTRL_FLUSH:
/* At this point we can't force a flush. */
- break;
+ return 1;
case BIO_CTRL_PUSH:
case BIO_CTRL_POP:
- ret = 0;
- break;
+ return 0;
+ case BIO_CTRL_EOF:
+ if (apr_file_eof(file) == APR_EOF)
+ return 1;
+ else
+ return 0;
+ default:
+ /* abort(); */
+ return 0;
}
- return ret;
}
#ifndef USE_OPENSSL_1_1_API
@@ -447,7 +477,7 @@ static BIO_METHOD bio_file_method = {
bio_file_read,
NULL, /* Is this called? */
bio_file_gets, /* Is this called? */
- bio_bucket_ctrl,
+ bio_file_ctrl,
bio_bucket_create,
bio_bucket_destroy,
#ifdef OPENSSL_VERSION_NUMBER
@@ -487,7 +517,7 @@ static BIO_METHOD *bio_meth_file_new(voi
BIO_meth_set_write(biom, bio_file_write);
BIO_meth_set_read(biom, bio_file_read);
BIO_meth_set_gets(biom, bio_file_gets);
- BIO_meth_set_ctrl(biom, bio_bucket_ctrl);
+ BIO_meth_set_ctrl(biom, bio_file_ctrl);
BIO_meth_set_create(biom, bio_bucket_create);
BIO_meth_set_destroy(biom, bio_bucket_destroy);
#else
@@ -1411,6 +1441,7 @@ static serf_ssl_context_t *ssl_init_cont
ssl_ctx->cached_cert_pw = 0;
ssl_ctx->pending_err = APR_SUCCESS;
ssl_ctx->fatal_err = APR_SUCCESS;
+ ssl_ctx->hit_eof = 0;
ssl_ctx->cert_callback = NULL;
ssl_ctx->cert_pw_callback = NULL;
Modified: serf/branches/1.3.x-r1902208+r1902304/test/server/test_server.h
URL:
http://svn.apache.org/viewvc/serf/branches/1.3.x-r1902208%2Br1902304/test/server/test_server.h?rev=1909397&r1=1909396&r2=1909397&view=diff
==============================================================================
--- serf/branches/1.3.x-r1902208+r1902304/test/server/test_server.h (original)
+++ serf/branches/1.3.x-r1902208+r1902304/test/server/test_server.h Tue Apr 25
08:49:22 2023
@@ -115,6 +115,7 @@ struct serv_ctx_t {
void *ssl_ctx;
const char *client_cn;
apr_status_t bio_read_status;
+ int hit_eof;
};
void setup_test_server(serv_ctx_t **servctx_p,
Modified: serf/branches/1.3.x-r1902208+r1902304/test/server/test_sslserver.c
URL:
http://svn.apache.org/viewvc/serf/branches/1.3.x-r1902208%2Br1902304/test/server/test_sslserver.c?rev=1909397&r1=1909396&r2=1909397&view=diff
==============================================================================
--- serf/branches/1.3.x-r1902208+r1902304/test/server/test_sslserver.c
(original)
+++ serf/branches/1.3.x-r1902208+r1902304/test/server/test_sslserver.c Tue Apr
25 08:49:22 2023
@@ -35,6 +35,7 @@ static int init_done = 0;
typedef struct ssl_context_t {
int handshake_done;
+ int hit_eof;
SSL_CTX* ctx;
SSL* ssl;
@@ -96,21 +97,22 @@ static int bio_apr_socket_destroy(BIO *b
static long bio_apr_socket_ctrl(BIO *bio, int cmd, long num, void *ptr)
{
- long ret = 1;
+ serv_ctx_t *serv_ctx = bio_get_data(bio);
+ ssl_context_t *ssl_ctx = serv_ctx->ssl_ctx;
switch (cmd) {
- default:
- /* abort(); */
- break;
case BIO_CTRL_FLUSH:
/* At this point we can't force a flush. */
- break;
+ return 1;
case BIO_CTRL_PUSH:
case BIO_CTRL_POP:
- ret = 0;
- break;
+ return 0;
+ case BIO_CTRL_EOF:
+ return ssl_ctx->hit_eof;
+ default:
+ /* abort(); */
+ return 0;
}
- return ret;
}
/* Returns the amount read. */
@@ -127,6 +129,10 @@ static int bio_apr_socket_read(BIO *bio,
serf__log_skt(TEST_VERBOSE, __FILE__, serv_ctx->client_sock,
"Read %d bytes from socket with status %d.\n", len, status);
+ if (APR_STATUS_IS_EOF(status)) {
+ serv_ctx->hit_eof = 1;
+ }
+
if (status == APR_EAGAIN) {
BIO_set_retry_read(bio);
if (len == 0)
@@ -305,6 +311,7 @@ static apr_status_t ssl_reset(serv_ctx_t
serf__log(TEST_VERBOSE, __FILE__, "Reset ssl context.\n");
ssl_ctx->handshake_done = 0;
+ ssl_ctx->hit_eof = 0;
if (ssl_ctx)
SSL_clear(ssl_ctx->ssl);
init_ssl(serv_ctx);