This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/9.2.x by this push:
     new 38b662c  Fix test_QUIC unit test builds. (#8678) (#8691)
38b662c is described below

commit 38b662cb1dc2157b321bb3ec2eee3ca9d760f8c9
Author: Brian Neradt <[email protected]>
AuthorDate: Tue Feb 22 12:04:51 2022 -0600

    Fix test_QUIC unit test builds. (#8678) (#8691)
    
    The test_QUIC unit tests were failing to build because they didn't link
    against a file with the TLSKeyLogger definition. This fixes the
    undefined references by breaking out TLSKeyLogger into a separate object
    that the unit tests can link with.
    
    (cherry picked from commit 2d70a007933176c80b09ddeaf164206794671442)
---
 iocore/net/Makefile.am        |   2 +
 iocore/net/P_SSLUtils.h       | 101 ---------------------------------
 iocore/net/P_TLSKeyLogger.h   | 129 ++++++++++++++++++++++++++++++++++++++++++
 iocore/net/SSLClientUtils.cc  |   1 +
 iocore/net/SSLConfig.cc       |   2 +-
 iocore/net/SSLUtils.cc        |  73 +-----------------------
 iocore/net/TLSKeyLogger.cc    |  98 ++++++++++++++++++++++++++++++++
 iocore/net/quic/Makefile.am   |   1 +
 iocore/net/quic/QUICConfig.cc |   2 +-
 proxy/http3/Makefile.am       |   1 +
 10 files changed, 235 insertions(+), 175 deletions(-)

diff --git a/iocore/net/Makefile.am b/iocore/net/Makefile.am
index dfeda52..77332b3 100644
--- a/iocore/net/Makefile.am
+++ b/iocore/net/Makefile.am
@@ -157,6 +157,7 @@ libinknet_a_SOURCES = \
        P_SSLUtils.h \
        P_SSLClientCoordinator.h \
        P_SSLClientUtils.h \
+       P_TLSKeyLogger.h \
        P_OCSPStapling.h \
        P_UDPConnection.h \
        P_UDPIOEvent.h \
@@ -191,6 +192,7 @@ libinknet_a_SOURCES = \
        SSLUtils.cc \
        OCSPStapling.cc \
        TLSBasicSupport.cc \
+       TLSKeyLogger.cc \
        TLSSessionResumptionSupport.cc \
        TLSSNISupport.cc \
        UDPIOEvent.cc \
diff --git a/iocore/net/P_SSLUtils.h b/iocore/net/P_SSLUtils.h
index 2091a44..8cdab40 100644
--- a/iocore/net/P_SSLUtils.h
+++ b/iocore/net/P_SSLUtils.h
@@ -35,9 +35,7 @@
 #include "P_SSLCertLookup.h"
 
 #include <map>
-#include <mutex>
 #include <set>
-#include <shared_mutex>
 
 struct SSLConfigParams;
 class SSLNetVConnection;
@@ -64,105 +62,6 @@ struct SSLLoadingContext {
   explicit SSLLoadingContext(SSL_CTX *c, SSLCertContextType ctx_type) : 
ctx(c), ctx_type(ctx_type) {}
 };
 
-/** A class for handling TLS secrets logging. */
-class TLSKeyLogger
-{
-public:
-  TLSKeyLogger(const TLSKeyLogger &) = delete;
-  TLSKeyLogger &operator=(const TLSKeyLogger &) = delete;
-
-  ~TLSKeyLogger()
-  {
-    std::unique_lock lock{_mutex};
-    close_keylog_file();
-  }
-
-  /** A callback for TLS secret key logging.
-   *
-   * This is the callback registered with OpenSSL's SSL_CTX_set_keylog_callback
-   * to log TLS secrets if the user enabled that feature. For more information
-   * about this callback, see OpenSSL's documentation of
-   * SSL_CTX_set_keylog_callback.
-   *
-   * @param[in] ssl The SSL object associated with the connection.
-   * @param[in] line The line to place in the keylog file.
-   */
-  static void
-  ssl_keylog_cb(const SSL *ssl, const char *line)
-  {
-    instance().log(line);
-  }
-
-  /** Return whether TLS key logging is enabled.
-   *
-   * @return True if TLS session key logging is enabled, false otherwise.
-   */
-  static bool
-  is_enabled()
-  {
-    return instance()._fd >= 0;
-  }
-
-  /** Enable keylogging.
-   *
-   * @param[in] keylog_file The path to the file to log TLS secrets to.
-   */
-  static void
-  enable_keylogging(const char *keylog_file)
-  {
-    instance().enable_keylogging_internal(keylog_file);
-  }
-
-  /** Disable TLS secrets logging. */
-  static void
-  disable_keylogging()
-  {
-    instance().disable_keylogging_internal();
-  }
-
-private:
-  TLSKeyLogger() = default;
-
-  /** Return the TLSKeyLogger singleton.
-   *
-   * We use a getter rather than a class static singleton member so that the
-   * construction of the singleton delayed until after TLS configuration is
-   * processed.
-   */
-  static TLSKeyLogger &
-  instance()
-  {
-    static TLSKeyLogger instance;
-    return instance;
-  }
-
-  /** Close the file descriptor for the key log file.
-   *
-   * @note This assumes that a unique lock has been acquired for _mutex.
-   */
-  void close_keylog_file();
-
-  /** A TLS secret line to log to the keylog file.
-   *
-   * @param[in] line A line to log to the keylog file.
-   */
-  void log(const char *line);
-
-  /** Enable TLS keylogging in the instance singleton. */
-  void enable_keylogging_internal(const char *keylog_file);
-
-  /** Disable TLS keylogging in the instance singleton. */
-  void disable_keylogging_internal();
-
-private:
-  /** A file descriptor for the log file receiving the TLS secrets. */
-  int _fd = -1;
-
-  /** A mutex to coordinate dynamically changing TLS logging config changes and
-   * logging to the TLS log file. */
-  std::shared_mutex _mutex;
-};
-
 /**
     @brief Load SSL certificates from ssl_multicert.config and setup 
SSLCertLookup for SSLCertificateConfig
  */
diff --git a/iocore/net/P_TLSKeyLogger.h b/iocore/net/P_TLSKeyLogger.h
new file mode 100644
index 0000000..73b1b70
--- /dev/null
+++ b/iocore/net/P_TLSKeyLogger.h
@@ -0,0 +1,129 @@
+/**
+
+  @section license License
+
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ */
+
+#pragma once
+
+#ifndef OPENSSL_IS_BORINGSSL
+#include <openssl/opensslconf.h>
+#endif
+#include <openssl/ssl.h>
+
+#include <memory>
+#include <shared_mutex>
+
+/** A class for handling TLS secrets logging. */
+class TLSKeyLogger
+{
+public:
+  TLSKeyLogger(const TLSKeyLogger &) = delete;
+  TLSKeyLogger &operator=(const TLSKeyLogger &) = delete;
+
+  ~TLSKeyLogger()
+  {
+    std::unique_lock lock{_mutex};
+    close_keylog_file();
+  }
+
+  /** A callback for TLS secret key logging.
+   *
+   * This is the callback registered with OpenSSL's SSL_CTX_set_keylog_callback
+   * to log TLS secrets if the user enabled that feature. For more information
+   * about this callback, see OpenSSL's documentation of
+   * SSL_CTX_set_keylog_callback.
+   *
+   * @param[in] ssl The SSL object associated with the connection.
+   * @param[in] line The line to place in the keylog file.
+   */
+  static void
+  ssl_keylog_cb(const SSL *ssl, const char *line)
+  {
+    instance().log(line);
+  }
+
+  /** Return whether TLS key logging is enabled.
+   *
+   * @return True if TLS session key logging is enabled, false otherwise.
+   */
+  static bool
+  is_enabled()
+  {
+    return instance()._fd >= 0;
+  }
+
+  /** Enable keylogging.
+   *
+   * @param[in] keylog_file The path to the file to log TLS secrets to.
+   */
+  static void
+  enable_keylogging(const char *keylog_file)
+  {
+    instance().enable_keylogging_internal(keylog_file);
+  }
+
+  /** Disable TLS secrets logging. */
+  static void
+  disable_keylogging()
+  {
+    instance().disable_keylogging_internal();
+  }
+
+private:
+  TLSKeyLogger() = default;
+
+  /** Return the TLSKeyLogger singleton.
+   *
+   * We use a getter rather than a class static singleton member so that the
+   * construction of the singleton delayed until after TLS configuration is
+   * processed.
+   */
+  static TLSKeyLogger &
+  instance()
+  {
+    static TLSKeyLogger instance;
+    return instance;
+  }
+
+  /** Close the file descriptor for the key log file.
+   *
+   * @note This assumes that a unique lock has been acquired for _mutex.
+   */
+  void close_keylog_file();
+
+  /** A TLS secret line to log to the keylog file.
+   *
+   * @param[in] line A line to log to the keylog file.
+   */
+  void log(const char *line);
+
+  /** Enable TLS keylogging in the instance singleton. */
+  void enable_keylogging_internal(const char *keylog_file);
+
+  /** Disable TLS keylogging in the instance singleton. */
+  void disable_keylogging_internal();
+
+private:
+  /** A file descriptor for the log file receiving the TLS secrets. */
+  int _fd = -1;
+
+  /** A mutex to coordinate dynamically changing TLS logging config changes and
+   * logging to the TLS log file. */
+  std::shared_mutex _mutex;
+};
diff --git a/iocore/net/SSLClientUtils.cc b/iocore/net/SSLClientUtils.cc
index 24bd22b..5975584 100644
--- a/iocore/net/SSLClientUtils.cc
+++ b/iocore/net/SSLClientUtils.cc
@@ -29,6 +29,7 @@
 #include "P_SSLClientUtils.h"
 #include "P_SSLConfig.h"
 #include "P_SSLNetVConnection.h"
+#include "P_TLSKeyLogger.h"
 #include "YamlSNIConfig.h"
 #include "SSLDiags.h"
 #include "SSLSessionCache.h"
diff --git a/iocore/net/SSLConfig.cc b/iocore/net/SSLConfig.cc
index 830ae1c..0d996dd 100644
--- a/iocore/net/SSLConfig.cc
+++ b/iocore/net/SSLConfig.cc
@@ -50,7 +50,7 @@
 #include "P_SSLSNI.h"
 #include "P_SSLCertLookup.h"
 #include "P_SSLSNI.h"
-#include "P_SSLUtils.h"
+#include "P_TLSKeyLogger.h"
 #include "SSLDiags.h"
 #include "SSLSessionCache.h"
 #include "SSLSessionTicket.h"
diff --git a/iocore/net/SSLUtils.cc b/iocore/net/SSLUtils.cc
index 07ae92c..3424b72 100644
--- a/iocore/net/SSLUtils.cc
+++ b/iocore/net/SSLUtils.cc
@@ -38,6 +38,7 @@
 #include "P_OCSPStapling.h"
 #include "P_SSLSNI.h"
 #include "P_SSLConfig.h"
+#include "P_TLSKeyLogger.h"
 #include "BoringSSLUtils.h"
 #include "ProxyProtocol.h"
 #include "SSLSessionCache.h"
@@ -46,11 +47,7 @@
 #include "SSLDiags.h"
 #include "SSLStats.h"
 
-#include <fcntl.h>
 #include <string>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/uio.h>
 #include <unistd.h>
 #include <termios.h>
 #include <vector>
@@ -104,74 +101,6 @@ static int ssl_vc_index = -1;
 static ink_mutex *mutex_buf      = nullptr;
 static bool open_ssl_initialized = false;
 
-// The caller of this function is responsible to acquire a unique_lock for
-// _mutex.
-void
-TLSKeyLogger::close_keylog_file()
-{
-  if (_fd == -1) {
-    return;
-  }
-  if (close(_fd) == -1) {
-    Error("Could not close keylog file: %s", strerror(errno));
-  }
-  _fd = -1;
-}
-
-void
-TLSKeyLogger::enable_keylogging_internal(const char *keylog_file)
-{
-#if TS_HAS_TLS_KEYLOGGING
-  Debug("ssl_keylog", "Enabling TLS key logging to: %s.", keylog_file);
-  std::unique_lock lock{_mutex};
-  if (keylog_file == nullptr) {
-    close_keylog_file();
-    Debug("ssl_keylog", "Received a nullptr for keylog_file: disabling 
keylogging.");
-    return;
-  }
-
-  _fd = open(keylog_file, O_WRONLY | O_APPEND | O_CREAT, S_IWUSR | S_IRUSR);
-  if (_fd == -1) {
-    Error("Could not open keylog file %s: %s", keylog_file, strerror(errno));
-    return;
-  }
-  Note("Opened %s for TLS key logging.", keylog_file);
-#else
-  Error("TLS keylogging is configured, but Traffic Server is not compiled with 
a version of OpenSSL that supports it.");
-  return;
-#endif /* TS_HAS_TLS_KEYLOGGING */
-}
-
-void
-TLSKeyLogger::disable_keylogging_internal()
-{
-  std::unique_lock lock{_mutex};
-  if (is_enabled()) {
-    Note("Disabling TLS key logging.");
-  }
-  close_keylog_file();
-  Debug("ssl_keylog", "TLS keylogging is disabled.");
-}
-
-void
-TLSKeyLogger::log(const char *line)
-{
-  std::shared_lock lock{_mutex};
-  if (!is_enabled()) {
-    return;
-  }
-
-  // writev() is guaranteed to be thread safe.
-  struct iovec vector[2];
-  vector[0].iov_base = const_cast<void *>(reinterpret_cast<const void 
*>(line));
-  vector[0].iov_len  = strlen(line);
-  vector[1].iov_base = const_cast<void *>(reinterpret_cast<const void 
*>("\n"));
-  vector[1].iov_len  = 1;
-  if (writev(_fd, vector, 2) <= 0) {
-    Error("Could not write TLS session key to key log file: %s", 
strerror(errno));
-  }
-}
-
 /* Using pthread thread ID and mutex functions directly, instead of
  * ATS this_ethread / ProxyMutex, so that other linked libraries
  * may use pthreads and openssl without confusing us here. (TS-2271).
diff --git a/iocore/net/TLSKeyLogger.cc b/iocore/net/TLSKeyLogger.cc
new file mode 100644
index 0000000..bdae514
--- /dev/null
+++ b/iocore/net/TLSKeyLogger.cc
@@ -0,0 +1,98 @@
+/** @file
+
+  @section license License
+
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ */
+
+#include "P_TLSKeyLogger.h"
+#include "tscore/Diags.h"
+
+#include <cstring>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+// The caller of this function is responsible to acquire a unique_lock for
+// _mutex.
+void
+TLSKeyLogger::close_keylog_file()
+{
+  if (_fd == -1) {
+    return;
+  }
+  if (close(_fd) == -1) {
+    Error("Could not close keylog file: %s", strerror(errno));
+  }
+  _fd = -1;
+}
+
+void
+TLSKeyLogger::enable_keylogging_internal(const char *keylog_file)
+{
+#if TS_HAS_TLS_KEYLOGGING
+  Debug("ssl_keylog", "Enabling TLS key logging to: %s.", keylog_file);
+  std::unique_lock lock{_mutex};
+  if (keylog_file == nullptr) {
+    close_keylog_file();
+    Debug("ssl_keylog", "Received a nullptr for keylog_file: disabling 
keylogging.");
+    return;
+  }
+
+  _fd = open(keylog_file, O_WRONLY | O_APPEND | O_CREAT, S_IWUSR | S_IRUSR);
+  if (_fd == -1) {
+    Error("Could not open keylog file %s: %s", keylog_file, strerror(errno));
+    return;
+  }
+  Note("Opened %s for TLS key logging.", keylog_file);
+#else
+  Error("TLS keylogging is configured, but Traffic Server is not compiled with 
a version of OpenSSL that supports it.");
+  return;
+#endif /* TS_HAS_TLS_KEYLOGGING */
+}
+
+void
+TLSKeyLogger::disable_keylogging_internal()
+{
+  std::unique_lock lock{_mutex};
+  if (is_enabled()) {
+    Note("Disabling TLS key logging.");
+  }
+  close_keylog_file();
+  Debug("ssl_keylog", "TLS keylogging is disabled.");
+}
+
+void
+TLSKeyLogger::log(const char *line)
+{
+  std::shared_lock lock{_mutex};
+  if (!is_enabled()) {
+    return;
+  }
+
+  // writev() is guaranteed to be thread safe.
+  struct iovec vector[2];
+  vector[0].iov_base = const_cast<void *>(reinterpret_cast<const void 
*>(line));
+  vector[0].iov_len  = strlen(line);
+  vector[1].iov_base = const_cast<void *>(reinterpret_cast<const void 
*>("\n"));
+  vector[1].iov_len  = 1;
+  if (writev(_fd, vector, 2) <= 0) {
+    Error("Could not write TLS session key to key log file: %s", 
strerror(errno));
+  }
+}
diff --git a/iocore/net/quic/Makefile.am b/iocore/net/quic/Makefile.am
index ca72382..ab32d25 100644
--- a/iocore/net/quic/Makefile.am
+++ b/iocore/net/quic/Makefile.am
@@ -148,6 +148,7 @@ test_LDADD = \
   $(top_builddir)/src/tscore/libtscore.la \
   $(top_builddir)/src/tscpp/util/libtscpputil.la \
   $(top_builddir)/proxy/ParentSelectionStrategy.o \
+  $(top_builddir)/iocore/net/TLSKeyLogger.o \
   @HWLOC_LIBS@ @OPENSSL_LIBS@ @LIBPCRE@ @YAMLCPP_LIBS@
 
 test_event_main_SOURCES = \
diff --git a/iocore/net/quic/QUICConfig.cc b/iocore/net/quic/QUICConfig.cc
index 50e75d7..8e06255 100644
--- a/iocore/net/quic/QUICConfig.cc
+++ b/iocore/net/quic/QUICConfig.cc
@@ -28,7 +28,7 @@
 #include <records/I_RecHttp.h>
 
 #include "P_SSLConfig.h"
-#include "P_SSLUtils.h"
+#include "P_TLSKeyLogger.h"
 
 #include "QUICGlobals.h"
 #include "QUICTransportParameters.h"
diff --git a/proxy/http3/Makefile.am b/proxy/http3/Makefile.am
index 979f3a6..7a0ea02 100644
--- a/proxy/http3/Makefile.am
+++ b/proxy/http3/Makefile.am
@@ -71,6 +71,7 @@ test_CPPFLAGS = \
 
 test_LDADD = \
   $(top_builddir)/iocore/net/quic/libquic.a \
+  $(top_builddir)/iocore/net/TLSKeyLogger.o \
   $(top_builddir)/iocore/eventsystem/libinkevent.a \
   $(top_builddir)/lib/records/librecords_p.a \
   $(top_builddir)/mgmt/libmgmt_p.la \

Reply via email to