On Wed, Jul 3, 2024 at 2:34 PM Ruediger Pluem <rpl...@apache.org> wrote: > > Thanks for the intense review. I hope I captured all stuff in the below.
Thanks for working on this. > I intentionally left the 'len' parameter of ssl_io_data_dump an apr_size_t in > case we ever get to the conclusion that we want to > make MODSSL_IO_DUMP_MAX larger. It will fit then automatically. > > Index: modules/ssl/ssl_engine_io.c > =================================================================== > --- modules/ssl/ssl_engine_io.c (revision 1918869) > +++ modules/ssl/ssl_engine_io.c (working copy) > @@ -2308,7 +2308,7 @@ > #define DUMP_WIDTH 16 > > static void ssl_io_data_dump(conn_rec *c, server_rec *s, > - const char *b, long len) > + const char *b, apr_size_t len) > { > char buf[256]; > int i, j, rows, trunc, pos; The problem is that some of the i,j,.. should apr_size_t too then. I'd rather we use "int len" here because APR_INT32_MAX is really a hard limit IMHO, we shouldn't take seconds/minutes to log things to disk anyway, and it'd avoid thinking about overflows here and keep things simple. > @@ -2361,11 +2361,13 @@ > } > if (trunc > 0) > ap_log_cserror(APLOG_MARK, APLOG_TRACE7, 0, c, s, > - "| %04ld - <SPACES/NULS>", len + trunc); > + "| %04" APR_SIZE_T_FMT " - <SPACES/NULS>", len + > (size_t)trunc); > ap_log_cserror(APLOG_MARK, APLOG_TRACE7, 0, c, s, > > "+-------------------------------------------------------------------------+"); > } > > +#define MODSSL_IO_DUMP_MAX APR_UINT16_MAX > + > #if OPENSSL_VERSION_NUMBER >= 0x30000000L > static long modssl_io_cb(BIO *bio, int cmd, const char *argp, > size_t len, int argi, long argl, int rc, > @@ -2379,9 +2381,9 @@ > conn_rec *c; > server_rec *s; > #if OPENSSL_VERSION_NUMBER >= 0x30000000L > - (void)len; > - (void)processed; > + (void)argi; > #endif > + (void)argl; > > if ((ssl = (SSL *)BIO_get_callback_arg(bio)) == NULL) > return rc; > @@ -2391,27 +2393,58 @@ > > if ( cmd == (BIO_CB_WRITE|BIO_CB_RETURN) > || cmd == (BIO_CB_READ |BIO_CB_RETURN) ) { > - if (rc >= 0) { > +#if OPENSSL_VERSION_NUMBER >= 0x30000000L > + apr_size_t requested_len = len; > + /* > + * On OpenSSL >= 3 rc uses the meaning of the BIO_read_ex and > + * BIO_write_ex functions return value and not the one of > + * BIO_read and BIO_write. Hence 0 indicates an error. > + */ > + int ok = (rc > 0); > +#else > + apr_size_t requested_len = (apr_size_t)argi; > + int ok = (rc >= 0); > +#endif > + if (ok) { > +#if OPENSSL_VERSION_NUMBER >= 0x30000000L > + apr_size_t actual_len = *processed; > +#else > + apr_size_t actual_len = (apr_size_t)rc; > +#endif > const char *dump = ""; > if (APLOG_CS_IS_LEVEL(c, s, APLOG_TRACE7)) { > - if (argp != NULL) > + if (argp == NULL) > + dump = "(Oops, no memory buffer?)"; > + else if (actual_len > MODSSL_IO_DUMP_MAX) > + dump = "(BIO dump follows, truncated to " > + APR_STRINGIFY(MODSSL_IO_DUMP_MAX) ")"; > + else > dump = "(BIO dump follows)"; > - else > - dump = "(Oops, no memory buffer?)"; > } > ap_log_cserror(APLOG_MARK, APLOG_TRACE4, 0, c, s, > - "%s: %s %ld/%d bytes %s BIO#%pp [mem: %pp] %s", > + "%s: %s %" APR_SIZE_T_FMT "/%" APR_SIZE_T_FMT > + " bytes %s BIO#%pp [mem: %pp] %s", > MODSSL_LIBRARY_NAME, > (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "write" : "read"), > - (long)rc, argi, (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? > "to" : "from"), > + actual_len, requested_len, > + (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "to" : "from"), > bio, argp, dump); > - if (*dump != '\0' && argp != NULL) > - ssl_io_data_dump(c, s, argp, rc); > + /* > + * *dump will only be != '\0' if > + * APLOG_CS_IS_LEVEL(c, s, APLOG_TRACE7) > + */ > + if (*dump != '\0' && argp != NULL) { > + apr_size_t dump_len = (actual_len >= MODSSL_IO_DUMP_MAX > + ? MODSSL_IO_DUMP_MAX > + : actual_len); So "int dump_len" here should be (more than) enough? > + ssl_io_data_dump(c, s, argp, dump_len); > + } > } > else { > ap_log_cserror(APLOG_MARK, APLOG_TRACE4, 0, c, s, > - "%s: I/O error, %d bytes expected to %s on BIO#%pp [mem: > %pp]", > - MODSSL_LIBRARY_NAME, argi, > + "%s: I/O error, %" APR_SIZE_T_FMT > + " bytes expected to %s on BIO#%pp [mem: %pp]", > + MODSSL_LIBRARY_NAME, requested_len, > (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "write" : "read"), > bio, argp); > } Regards; Yann.