On Tue, Jul 2, 2024 at 10:57 AM Ruediger Pluem <rpl...@apache.org> wrote:
>
> On 7/1/24 3:01 PM, Ruediger Pluem wrote:
> >
> >
> > On 6/27/24 3:48 PM, Ruediger Pluem wrote:
> >>
> >>
> >> On 6/27/24 12:47 PM, Yann Ylavic wrote:
> >>> On Thu, Jun 27, 2024 at 12:38 PM Yann Ylavic <ylavic....@gmail.com> wrote:
> >>>>
> >>>> On Thu, Jun 27, 2024 at 12:07 PM Ruediger Pluem <rpl...@apache.org> 
> >>>> wrote:
> >>>>>
> >>>>> How about the below? I am yet undecided if I should follow the below 
> >>>>> approach to have
> >>>>> two completely separate callbacks depending on the OpenSSL version or 
> >>>>> one with a lot of
> >>>>> #If statements in it, but as much shared code as possible. Thoughts?
> >>>>
> >>>> Hm, I wouldn't duplicate the whole thing depending on openssl version.
> >>>>
> >>>> Something like the attached maybe? modssl_io_cb() will just consider
> >>>> up to APR_INT32_MAX bytes, more shouldn't happen anyway and it's more
> >>>> than enough for debug logs..
> >>>
> >>> We could even log the real length still if it matters, see attached v2.
> >>
> >> Thanks. Unfortunately the meaning of rc varies depending on if we have the 
> >> ex or the non ex callback.
> >> This is not in the documentation but only in the OpenSSL code :-(.
> >> Furthermore the processed amount of data is in *processed in the ex case 
> >> whereas in the non ex case it is in
> >> rc. The intended amount of data to be processed is in len in the ex case 
> >> and in argi in the non ex case.
> >> Hence I propose the patch below. Of course we can have a longer debate if 
> >> the len parameter to ssl_io_data_dump
> >> should be int or size_t :-). And yes dumping more than APR_INT32_MAX bytes 
> >> to the log might be bad.
> >
> > Any further comments on whether we should limit the dump to APR_INT32_MAX 
> > or not? I would guess that it will not matter
> > in practice, but I am still open to it.
> > BTW: I guess
> >
> >  int len = data_len & APR_INT32_MAX;
> >
> > would be wrong. It would need to be
> >
> >  int len = data_len > APR_INT32_MAX ? APR_INT32_MAX : (int)data_len;
> >
> > instead.

Right! Maybe APR_UINT16_MAX is enough, I don't think we should log
more undecipherable text than that :)
IIRC an SSL/TLS payload is 16K (still?) anyway so we shouldn't be
called for more than that (though multiple times)?

>
> Updated patch.
>
> Index: modules/ssl/ssl_engine_io.c
> ===================================================================
> --- modules/ssl/ssl_engine_io.c (revision 1918813)
> +++ 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, size_t len)
>  {
>      char buf[256];
>      int i, j, rows, trunc, pos;
> @@ -2361,7 +2361,7 @@
>      }
>      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,
>              
> "+-------------------------------------------------------------------------+");
>  }
> @@ -2379,9 +2379,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,7 +2391,20 @@
>
>      if (   cmd == (BIO_CB_WRITE|BIO_CB_RETURN)
>          || cmd == (BIO_CB_READ |BIO_CB_RETURN) ) {
> +#if OPENSSL_VERSION_NUMBER >= 0x30000000L
> +#define requested_len (len)
> +#define actual_len (*processed)
           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.
> +         */
> +        if (rc > 0) {
> +#else
> +#define requested_len ((size_t)argi)
> +#define actual_len ((size_t)rc)
>          if (rc >= 0) {
> +#endif
Maybe use variables like:
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
           apr_size_t requested_len = len;
           int ok = (rc > 0);
#else
           apr_size_t requested_len = 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 = rc;
#endif
>              const char *dump = "";
>              if (APLOG_CS_IS_LEVEL(c, s, APLOG_TRACE7)) {
>                  if (argp != NULL)
> @@ -2400,23 +2413,28 @@
>                      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);
> +                ssl_io_data_dump(c, s, argp, actual_len);
And here:
                   long dump_len = (actual_len >= APR_UINT16_MAX
                                    ? APR_UINT16_MAX
                                    : actual_len);
                   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);
>          }
>      }
>      return rc;
> +#undef requested_len
> +#undef actual_len
>  }
?


Regards;
Yann.

Reply via email to