Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rabbitmq-c for openSUSE:Factory 
checked in at 2024-04-15 20:18:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rabbitmq-c (Old)
 and      /work/SRC/openSUSE:Factory/.rabbitmq-c.new.26366 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rabbitmq-c"

Mon Apr 15 20:18:03 2024 rev:10 rq:1167750 version:0.14.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/rabbitmq-c/rabbitmq-c.changes    2023-06-28 
21:33:27.205893238 +0200
+++ /work/SRC/openSUSE:Factory/.rabbitmq-c.new.26366/rabbitmq-c.changes 
2024-04-15 20:24:08.665181286 +0200
@@ -1,0 +2,23 @@
+Wed Apr  3 11:31:37 UTC 2024 - pgaj...@suse.com
+
+- version update to 0.14.0
+  ## v0.14.0 - 2024-03-18
+  ## Fixed
+  - Fix potential stackoverflow in decoding table and array
+  - Fix issue with Mach-O version (#758)
+  - Make dependency on OpenSSL in rabbitmq-c.cmake match what is built (#725)
+  - Fix pkg-config generation when CMAKE_INSTALL_DIR is absolute (#733)
+  - Fix issue with amqp_basic_publish blocking in non-blocking mode (#780)
+  - Fix SSL hostname check (#784)
+  - Fix bug in amqp-consume documentation #791
+  ## Changed
+  - CMake minimum version is now 3.22
+  - OpenSSL minimum version is now 1.1.1
+  - Minimum TLS version supported is v1.2 (v1.3 is also supported).
+  - OpenSSL ENGINE APIs are conditionally enabled based on availability
+  ## Added
+  - Add option to read username/password from file in tools (#781)
+  - Add amqp_ssl_socket_enable_default_verify_paths API to allow loading from 
default certification paths
+  - rabbitmq-c can be compiled against BoringSSL (#814)
+
+-------------------------------------------------------------------

Old:
----
  rabbitmq-c-0.13.0.tar.gz

New:
----
  rabbitmq-c-0.14.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rabbitmq-c.spec ++++++
--- /var/tmp/diff_new_pack.NIDlLW/_old  2024-04-15 20:24:09.097197193 +0200
+++ /var/tmp/diff_new_pack.NIDlLW/_new  2024-04-15 20:24:09.101197339 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package rabbitmq-c
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 # Copyright (c) 2012-2015 Remi Collet
 #
 # All modifications and additions to the file contributed by third parties
@@ -20,7 +20,7 @@
 %global libname     librabbitmq
 %global majsonum    4
 Name:           rabbitmq-c
-Version:        0.13.0
+Version:        0.14.0
 Release:        0
 Summary:        Client library for AMQP
 License:        MIT

++++++ rabbitmq-c-0.13.0.tar.gz -> rabbitmq-c-0.14.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/.devcontainer/Dockerfile 
new/rabbitmq-c-0.14.0/.devcontainer/Dockerfile
--- old/rabbitmq-c-0.13.0/.devcontainer/Dockerfile      1970-01-01 
01:00:00.000000000 +0100
+++ new/rabbitmq-c-0.14.0/.devcontainer/Dockerfile      2024-03-23 
20:23:35.000000000 +0100
@@ -0,0 +1,18 @@
+FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12
+
+ARG REINSTALL_CMAKE_VERSION_FROM_SOURCE="3.28.1"
+
+# Optionally install the cmake for vcpkg
+COPY ./reinstall-cmake.sh /tmp/
+
+RUN if [ "${REINSTALL_CMAKE_VERSION_FROM_SOURCE}" != "none" ]; then \
+        chmod +x /tmp/reinstall-cmake.sh && /tmp/reinstall-cmake.sh 
${REINSTALL_CMAKE_VERSION_FROM_SOURCE}; \
+    fi \
+    && rm -f /tmp/reinstall-cmake.sh
+
+# [Optional] Uncomment this section to install additional vcpkg ports.
+# RUN su vscode -c "${VCPKG_ROOT}/vcpkg install <your-port-name-here>"
+
+# [Optional] Uncomment this section to install additional packages.
+RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+    && apt-get -y install --no-install-recommends libssl-dev libpopt-dev 
clang-format clangd xmlto doxygen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/.devcontainer/devcontainer.json 
new/rabbitmq-c-0.14.0/.devcontainer/devcontainer.json
--- old/rabbitmq-c-0.13.0/.devcontainer/devcontainer.json       1970-01-01 
01:00:00.000000000 +0100
+++ new/rabbitmq-c-0.14.0/.devcontainer/devcontainer.json       2024-03-23 
20:23:35.000000000 +0100
@@ -0,0 +1,26 @@
+// For format details, see https://aka.ms/devcontainer.json. For config 
options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
+{
+       "name": "C++",
+       "build": {
+               "dockerfile": "Dockerfile"
+       },
+       "features": {
+               "ghcr.io/itsmechlark/features/rabbitmq-server:1": {}
+       }
+
+       // Features to add to the dev container. More info: 
https://containers.dev/features.
+       // "features": {},
+
+       // Use 'forwardPorts' to make a list of ports inside the container 
available locally.
+       // "forwardPorts": [],
+
+       // Use 'postCreateCommand' to run commands after the container is 
created.
+       // "postCreateCommand": "gcc -v",
+
+       // Configure tool-specific properties.
+       // "customizations": {},
+
+       // Uncomment to connect as root instead. More info: 
https://aka.ms/dev-containers-non-root.
+       // "remoteUser": "root"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/.devcontainer/reinstall-cmake.sh 
new/rabbitmq-c-0.14.0/.devcontainer/reinstall-cmake.sh
--- old/rabbitmq-c-0.13.0/.devcontainer/reinstall-cmake.sh      1970-01-01 
01:00:00.000000000 +0100
+++ new/rabbitmq-c-0.14.0/.devcontainer/reinstall-cmake.sh      2024-03-23 
20:23:35.000000000 +0100
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+#-------------------------------------------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See 
https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
+#-------------------------------------------------------------------------------------------------------------
+#
+set -e
+
+CMAKE_VERSION=${1:-"none"}
+
+if [ "${CMAKE_VERSION}" = "none" ]; then
+    echo "No CMake version specified, skipping CMake reinstallation"
+    exit 0
+fi
+
+# Cleanup temporary directory and associated files when exiting the script.
+cleanup() {
+    EXIT_CODE=$?
+    set +e
+    if [[ -n "${TMP_DIR}" ]]; then
+        echo "Executing cleanup of tmp files"
+        rm -Rf "${TMP_DIR}"
+    fi
+    exit $EXIT_CODE
+}
+trap cleanup EXIT
+
+
+echo "Installing CMake..."
+apt-get -y purge --auto-remove cmake
+mkdir -p /opt/cmake
+
+architecture=$(dpkg --print-architecture)
+case "${architecture}" in
+    arm64)
+        ARCH=aarch64 ;;
+    amd64)
+        ARCH=x86_64 ;;
+    *)
+        echo "Unsupported architecture ${architecture}."
+        exit 1
+        ;;
+esac
+
+CMAKE_BINARY_NAME="cmake-${CMAKE_VERSION}-linux-${ARCH}.sh"
+CMAKE_CHECKSUM_NAME="cmake-${CMAKE_VERSION}-SHA-256.txt"
+TMP_DIR=$(mktemp -d -t cmake-XXXXXXXXXX)
+
+echo "${TMP_DIR}"
+cd "${TMP_DIR}"
+
+curl -sSL 
"https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_BINARY_NAME}";
 -O
+curl -sSL 
"https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/${CMAKE_CHECKSUM_NAME}";
 -O
+
+sha256sum -c --ignore-missing "${CMAKE_CHECKSUM_NAME}"
+sh "${TMP_DIR}/${CMAKE_BINARY_NAME}" --prefix=/opt/cmake --skip-license
+
+ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake
+ln -s /opt/cmake/bin/ctest /usr/local/bin/ctest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/.github/workflows/ci.yml 
new/rabbitmq-c-0.14.0/.github/workflows/ci.yml
--- old/rabbitmq-c-0.13.0/.github/workflows/ci.yml      2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/.github/workflows/ci.yml      2024-03-23 
20:23:35.000000000 +0100
@@ -37,7 +37,9 @@
         submodules: true
     - name: Install Prerequisites
       shell: bash
-      run: sudo apt install -y ninja-build libpopt-dev
+      run: |
+        sudo apt update
+        sudo apt install -y ninja-build libpopt-dev
 
     - name: Configure Build & Test
       shell: bash
@@ -65,8 +67,6 @@
     - uses: actions/checkout@v2
       with:
         submodules: true
-    - name: Install Prerequisites
-      run: choco install openssl
     - name: Configure Build & Test
       shell: bash
       run: |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/.github/workflows/cifuzz.yml 
new/rabbitmq-c-0.14.0/.github/workflows/cifuzz.yml
--- old/rabbitmq-c-0.13.0/.github/workflows/cifuzz.yml  1970-01-01 
01:00:00.000000000 +0100
+++ new/rabbitmq-c-0.14.0/.github/workflows/cifuzz.yml  2024-03-23 
20:23:35.000000000 +0100
@@ -0,0 +1,32 @@
+name: CIFuzz
+on: [pull_request]
+jobs:
+  Fuzzing:
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        sanitizer: [address, undefined, memory]
+    steps:
+    - name: Build Fuzzers (${{ matrix.sanitizer }})
+      id: build
+      uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
+      with:
+        oss-fuzz-project-name: 'rabbitmq-c'
+        dry-run: false
+        language: c
+        sanitizer: ${{ matrix.sanitizer }}
+    - name: Run Fuzzers (${{ matrix.sanitizer }})
+      uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
+      with:
+        oss-fuzz-project-name: 'rabbitmq-c'
+        dry-run: false
+        language: c
+        fuzz-seconds: 300
+        sanitizer: ${{ matrix.sanitizer }}
+    - name: Upload Crash
+      uses: actions/upload-artifact@v1
+      if: failure() && steps.build.outcome == 'success'
+      with:
+        name: ${{ matrix.sanitizer }}-artifacts
+        path: ./out/artifacts
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/rabbitmq-c-0.13.0/.github/workflows/codeql-analysis.yml 
new/rabbitmq-c-0.14.0/.github/workflows/codeql-analysis.yml
--- old/rabbitmq-c-0.13.0/.github/workflows/codeql-analysis.yml 2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/.github/workflows/codeql-analysis.yml 2024-03-23 
20:23:35.000000000 +0100
@@ -28,7 +28,7 @@
       uses: actions/checkout@v2
 
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@v1
+      uses: github/codeql-action/init@v2
       with:
         languages: ${{ matrix.language }}
 
@@ -47,4 +47,4 @@
        cmake --build build
 
     - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@v1
+      uses: github/codeql-action/analyze@v2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/CMakeLists.txt 
new/rabbitmq-c-0.14.0/CMakeLists.txt
--- old/rabbitmq-c-0.13.0/CMakeLists.txt        2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/CMakeLists.txt        2024-03-23 20:23:35.000000000 
+0100
@@ -1,7 +1,7 @@
 # Copyright 2007 - 2021, Alan Antonuk and the rabbitmq-c contributors.
 # SPDX-License-Identifier: mit
 
-cmake_minimum_required(VERSION 3.12...3.18)
+cmake_minimum_required(VERSION 3.22...3.26)
 
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 
@@ -13,9 +13,9 @@
 # 3. If any interfaces have been added since the last public release, then 
increment age.
 # 4. If any interfaces have been removed since the last public release, then 
set age to 0.
 
-set(RMQ_SOVERSION_CURRENT   9)
-set(RMQ_SOVERSION_REVISION  4)
-set(RMQ_SOVERSION_AGE       5)
+set(RMQ_SOVERSION_CURRENT   10)
+set(RMQ_SOVERSION_REVISION  0)
+set(RMQ_SOVERSION_AGE       6)
 
 include(VersionFunctions)
 get_library_version(RMQ_VERSION)
@@ -42,6 +42,7 @@
 
 include(CheckSymbolExists)
 include(CheckLibraryExists)
+include(CMakeDependentOption)
 include(CMakePushCheckState)
 include(GNUInstallDirs)
 
@@ -113,20 +114,32 @@
 option(ENABLE_SSL_SUPPORT "Enable SSL support" ON)
 
 if (ENABLE_SSL_SUPPORT)
-  find_package(OpenSSL 1.1.1 REQUIRED)
+  # Manually check OpenSSL version because BoringSSL doesn't support version 
checking via find_package
+  set(RMQ_OPENSSL_MIN_VERSION 1.1.1)
+  find_package(OpenSSL REQUIRED)
+  if(OPENSSL_VERSION) # Will be empty for BoringSSL
+    if(OPENSSL_VERSION VERSION_LESS RMQ_OPENSSL_MIN_VERSION)
+      MESSAGE(FATAL_ERROR "Found OpenSSL version ${OPENSSL_VERSION} but 
${RMQ_OPENSSL_MIN_VERSION} or later is required")
+    endif()
+  endif()
 
   cmake_push_check_state()
   set(THREADS_PREFER_PTHREAD_FLAG ON)
   find_package(Threads REQUIRED)
   cmake_pop_check_state()
+
+  cmake_push_check_state()
+  set(CMAKE_REQUIRED_LIBRARIES OpenSSL::SSL)
+  check_symbol_exists(ENGINE_new openssl/engine.h HAS_OPENSSL_ENGINE)
+  cmake_pop_check_state()
+
+  cmake_dependent_option(ENABLE_SSL_ENGINE_API "Enable support for deprecated 
OpenSSL ENGINE feature" ON "HAS_OPENSSL_ENGINE" OFF)
 endif()
 
-if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
+if(PROJECT_IS_TOP_LEVEL)
   include(CTest)
 endif()
 
-include(CMakeDependentOption)
-
 option(BUILD_SHARED_LIBS "Build rabbitmq-c as a shared library" ON)
 option(BUILD_STATIC_LIBS "Build rabbitmq-c as a static library" ON)
 option(INSTALL_STATIC_LIBS "Install rabbitmq-c static library" ON)
@@ -144,14 +157,6 @@
 
 set(targets_export_name rabbitmq-targets)
 
-if(BUILD_OSSFUZZ)
-  if (NOT BUILD_STATIC_LIBS)
-    message(FATAL_ERROR "OSS-FUZZ can only be built against static libraries " 
"(set BUILD_STATIC_LIBS=ON)")
-  endif ()
-  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
-  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
-endif ()
-
 add_subdirectory(librabbitmq)
 
 if(BUILD_EXAMPLES)
@@ -169,7 +174,7 @@
   add_subdirectory(tools)
 endif()
 
-if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
+if(PROJECT_IS_TOP_LEVEL AND BUILD_TESTING)
   if (NOT BUILD_STATIC_LIBS)
     message(FATAL_ERROR
       "Tests can only be built against static libraries "
@@ -179,6 +184,9 @@
 endif ()
 
 if(BUILD_OSSFUZZ)
+  if (NOT BUILD_STATIC_LIBS)
+    message(FATAL_ERROR "OSS-FUZZ can only be built against static libraries " 
"(set BUILD_STATIC_LIBS=ON)")
+  endif ()
   add_subdirectory(fuzz)
 endif ()
 
@@ -206,8 +214,8 @@
 
 set(prefix ${CMAKE_INSTALL_PREFIX})
 set(exec_prefix "\${prefix}")
-set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
-set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
+cmake_path(APPEND libdir "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}")
+cmake_path(APPEND includedir "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
 
 configure_file(cmake/config.h.in 
${CMAKE_CURRENT_BINARY_DIR}/librabbitmq/config.h)
 configure_file(librabbitmq.pc.in ${CMAKE_CURRENT_BINARY_DIR}/librabbitmq.pc 
@ONLY)
@@ -220,7 +228,7 @@
 write_basic_package_version_file(
     "${version_config}"
     VERSION ${RMQ_VERSION}
-    COMPATIBILITY AnyNewerVersion)
+    COMPATIBILITY SameMajorVersion)
 
 configure_package_config_file(
     "${CMAKE_CURRENT_SOURCE_DIR}/cmake/rabbitmq-c-config.cmake.in"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/ChangeLog.md 
new/rabbitmq-c-0.14.0/ChangeLog.md
--- old/rabbitmq-c-0.13.0/ChangeLog.md  2023-02-06 01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/ChangeLog.md  2024-03-23 20:23:35.000000000 +0100
@@ -1,4 +1,25 @@
 # Change Log
+## v0.14.0 - 2024-03-18
+## Fixed
+- Fix potential stackoverflow in decoding table and array
+- Fix issue with Mach-O version (#758)
+- Make dependency on OpenSSL in rabbitmq-c.cmake match what is built (#725)
+- Fix pkg-config generation when CMAKE_INSTALL_DIR is absolute (#733)
+- Fix issue with amqp_basic_publish blocking in non-blocking mode (#780)
+- Fix SSL hostname check (#784)
+- Fix bug in amqp-consume documentation #791
+
+## Changed
+- CMake minimum version is now 3.22
+- OpenSSL minimum version is now 1.1.1
+- Minimum TLS version supported is v1.2 (v1.3 is also supported).
+- OpenSSL ENGINE APIs are conditionally enabled based on availability
+
+## Added
+- Add option to read username/password from file in tools (#781)
+- Add amqp_ssl_socket_enable_default_verify_paths API to allow loading from 
default certification paths
+- rabbitmq-c can be compiled against BoringSSL (#814)
+
 ## v0.13.0 - 2023-02-05
 ## Fixed
 - Fixed missing option to not install static library (#665)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/README.md 
new/rabbitmq-c-0.14.0/README.md
--- old/rabbitmq-c-0.13.0/README.md     2023-02-06 01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/README.md     2024-03-23 20:23:35.000000000 +0100
@@ -4,6 +4,10 @@
 
 [![Coverage 
Status](https://coveralls.io/repos/github/alanxz/rabbitmq-c/badge.svg?branch=master)](https://coveralls.io/github/alanxz/rabbitmq-c?branch=master)
 
+[![Fuzzing 
Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/rabbitmq-c.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html#rabbitmq-c)
+
+[![OpenSSF Best 
Practices](https://www.bestpractices.dev/projects/7001/badge)](https://www.bestpractices.dev/projects/7001)
+
 ## Introduction
 
 This is a C-language AMQP client library for use with v2.0+ of the
@@ -34,7 +38,7 @@
 ### Building and installing
 
 #### Prereqs:
-- [CMake v3.12 or better](http://www.cmake.org/)
+- [CMake v3.22 or better](http://www.cmake.org/)
 - A C compiler (GCC 4.4+, clang, and MSVC are test. Other compilers may also
   work)
 - *Optionally* [OpenSSL](http://www.openssl.org/) v1.1.1+ to enable support for
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/cmake/config.h.in 
new/rabbitmq-c-0.14.0/cmake/config.h.in
--- old/rabbitmq-c-0.13.0/cmake/config.h.in     2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/cmake/config.h.in     2024-03-23 20:23:35.000000000 
+0100
@@ -7,4 +7,6 @@
 
 #define AMQ_PLATFORM "@CMAKE_SYSTEM_NAME@"
 
+#cmakedefine ENABLE_SSL_ENGINE_API
+
 #endif /* CONFIG_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/cmake/rabbitmq-c-config.cmake.in 
new/rabbitmq-c-0.14.0/cmake/rabbitmq-c-config.cmake.in
--- old/rabbitmq-c-0.13.0/cmake/rabbitmq-c-config.cmake.in      2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/cmake/rabbitmq-c-config.cmake.in      2024-03-23 
20:23:35.000000000 +0100
@@ -1,4 +1,17 @@
 @PACKAGE_INIT@
 
+set(RMQ_USES_OPENSSL @ENABLE_SSL_SUPPORT@)
+
+include(CMakeFindDependencyMacro)
+
+if (RMQ_USES_OPENSSL)
+  find_dependency(OpenSSL REQUIRED)
+  if(OPENSSL_VERSION)
+    if(OPENSSL_VERSION VERSION_LESS RMQ_OPENSSL_MIN_VERSION)
+      MESSAGE(FATAL_ERROR "Found OpenSSL version @OPENSSL_VERSION@ but 
@RMQ_OPENSSL_MIN_VERSION@ or later is required")
+    endif()
+  endif()
+endif ()
+
 include(${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake)
 check_required_components(rabbitmq-c)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/fuzz/fuzz_server.c 
new/rabbitmq-c-0.14.0/fuzz/fuzz_server.c
--- old/rabbitmq-c-0.13.0/fuzz/fuzz_server.c    2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/fuzz/fuzz_server.c    2024-03-23 20:23:35.000000000 
+0100
@@ -2,6 +2,7 @@
 // SPDX-License-Identifier: mit
 
 #include <arpa/inet.h>
+#include <errno.h>
 #include <netinet/in.h>
 #include <pthread.h>
 #include <stdint.h>
@@ -24,45 +25,75 @@
 };
 typedef struct Fuzzer Fuzzer;
 
-#define PORT 8080
-#define kMinInputLength 9
+#define PORT 5672
+#define kMinInputLength 8
 #define kMaxInputLength 1024
 
 void client(Fuzzer *fuzzer);
 
 void fuzzinit(Fuzzer *fuzzer) {
   struct sockaddr_in server_addr;
+  int res;
   fuzzer->socket = socket(AF_INET, SOCK_STREAM, 0);
+  if (fuzzer->socket == -1) {
+    fprintf(stderr, "socket failed %s\n", strerror(errno));
+    exit(1);
+  }
+  memset(&server_addr, 0, sizeof(server_addr));
   server_addr.sin_family = AF_INET;
   server_addr.sin_port = htons(fuzzer->port);
   server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
-  setsockopt(fuzzer->socket, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
-  bind(fuzzer->socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
-  listen(fuzzer->socket, 1);
+  res = setsockopt(fuzzer->socket, SOL_SOCKET, SO_REUSEADDR, &(int){1}, 
sizeof(int));
+  if (res) {
+    fprintf(stderr, "setsockopt failed: %s\n", strerror(errno));
+    exit(1);
+  }
+
+  res = bind(fuzzer->socket, (struct sockaddr *)&server_addr, 
sizeof(server_addr));
+  if (res) {
+    fprintf(stderr, "bind failed: %s\n", strerror(errno));
+    exit(1);
+  }
+  res = listen(fuzzer->socket, 1);
+  if (res) {
+    fprintf(stderr, "listen failed: %s\n", strerror(errno));
+    exit(1);
+  }
 }
 
 void *Server(void *args) {
   Fuzzer *fuzzer = (Fuzzer *)args;
 
   int client;
+  int res;
   char clientData[10240];
-  struct sockaddr_in clientAddr;
-  uint32_t clientSZ = sizeof(clientAddr);
 
-  client = accept(fuzzer->socket, (struct sockaddr *)&clientAddr, &clientSZ);
+  client = accept(fuzzer->socket, NULL, NULL);
+  if (client == -1) {
+    fprintf(stderr, "accept failed: %s\n", strerror(errno));
+    exit(1);
+  }
 
-  recv(client, clientData, sizeof(clientData), 0);
-  send(client, fuzzer->buffer, fuzzer->size, 0);
+  res = recv(client, clientData, sizeof(clientData), 0);
+  if (res == -1) {
+    fprintf(stderr, "recv failed: %s\n", strerror(errno));
+    exit(1);
+  }
+  res = send(client, fuzzer->buffer, fuzzer->size, 0);
+  if (res == -1) {
+    fprintf(stderr, "send failed: %s\n", strerror(errno));
+    exit(1);
+  }
 
-  shutdown(client, SHUT_RDWR);
+  res = shutdown(client, SHUT_RDWR);
   close(client);
-
-  pthread_exit(NULL);
+  return NULL;
 }
 
 void clean(Fuzzer *fuzzer) {
   shutdown(fuzzer->socket, SHUT_RDWR);
   close(fuzzer->socket);
+  free(fuzzer->buffer);
   free(fuzzer);
 }
 
@@ -75,6 +106,10 @@
   Fuzzer *fuzzer = (Fuzzer *)malloc(sizeof(Fuzzer));
   fuzzer->port = PORT;
 
+  fuzzer->size = size;
+  fuzzer->buffer = malloc(fuzzer->size);
+  memcpy(fuzzer->buffer, data, size);
+
   fuzzinit(fuzzer);
 
   pthread_create(&fuzzer->thread, NULL, Server, fuzzer);
@@ -94,7 +129,7 @@
   amqp_socket_t *socket = NULL;
   amqp_connection_state_t conn;
 
-  hostname = "localhost";
+  hostname = "127.0.0.1";
 
   conn = amqp_new_connection();
 
@@ -104,7 +139,10 @@
   }
 
   status = amqp_socket_open(socket, hostname, fuzzer->port);
-  if (status) {
+  if (status != AMQP_STATUS_OK) {
+    int sav_errno = errno;
+    fprintf(stderr, "amqp_socket_open failed: %s\n", 
amqp_error_string2(status));
+    fprintf(stderr, "amqp_socket_open errno: %d: %s\n", sav_errno, 
strerror(sav_errno));
     exit(1);
   }
 
@@ -112,4 +150,3 @@
 
   amqp_destroy_connection(conn);
 }
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/fuzz/fuzz_table.c 
new/rabbitmq-c-0.14.0/fuzz/fuzz_table.c
--- old/rabbitmq-c-0.13.0/fuzz/fuzz_table.c     2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/fuzz/fuzz_table.c     2024-03-23 20:23:35.000000000 
+0100
@@ -13,7 +13,7 @@
 
 extern int LLVMFuzzerTestOneInput(const char *data, size_t size) {
 
-  int result;
+  int unused_result;
   amqp_pool_t pool;
 
   init_amqp_pool(&pool, 4096);
@@ -24,8 +24,9 @@
     decoding_bytes.len = size;
     decoding_bytes.bytes = (uint8_t *)data;
 
-    result =
+    unused_result =
         amqp_decode_table(decoding_bytes, &pool, &decoded, &decoding_offset);
   }
-  return result;
+  empty_amqp_pool(&pool);
+  return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/fuzz/fuzz_url.c 
new/rabbitmq-c-0.14.0/fuzz/fuzz_url.c
--- old/rabbitmq-c-0.13.0/fuzz/fuzz_url.c       2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/fuzz/fuzz_url.c       2024-03-23 20:23:35.000000000 
+0100
@@ -4,14 +4,21 @@
 #include <inttypes.h>
 #include <stddef.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include <rabbitmq-c/amqp.h>
 
 extern int LLVMFuzzerTestOneInput(const char *data, size_t size) {
+  // amqp_parse_url expects null-terminated string that it can modify,
+  // LLVMFuzzer expects that data will not be modified and won't necessarily
+  // null terminate the string, so do that here.
+  char* in = malloc(size + 1);
+  memcpy(in, data, size);
+  in[size] = '\0';
 
   struct amqp_connection_info ci;
-  int res;
-  res = amqp_parse_url((char *)data, &ci);
-  return res;
+  amqp_parse_url(in, &ci);
+  free(in);
+  return 0;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/include/amqp.h 
new/rabbitmq-c-0.14.0/include/amqp.h
--- old/rabbitmq-c-0.13.0/include/amqp.h        2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/include/amqp.h        2024-03-23 20:23:35.000000000 
+0100
@@ -4,7 +4,11 @@
 #ifndef AMQP_H
 #define AMQP_H
 
-#warning "amqp.h is deprecated, use rabbitmq-c/amqp.h instead."
+#ifdef _MSC_VER
+#   pragma message("warning: amqp.h is deprecated, use rabbitmq-c/amqp.h 
instead.")
+#else
+#   warning "amqp.h is deprecated, use rabbitmq-c/amqp.h instead."
+#endif
 
 #include <rabbitmq-c/amqp.h>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/include/amqp_framing.h 
new/rabbitmq-c-0.14.0/include/amqp_framing.h
--- old/rabbitmq-c-0.13.0/include/amqp_framing.h        2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/include/amqp_framing.h        2024-03-23 
20:23:35.000000000 +0100
@@ -5,7 +5,11 @@
 #ifndef AMQP_FRAMING_H
 #define AMQP_FRAMING_H
 
-#warning "amqp_framing.h is deprecated, use rabbitmq-c/framing.h instead.
+#ifdef _MSC_VER
+#   pragma message("warning: amqp_framing.h is deprecated, use 
rabbitmq-c/framing.h instead.")
+#else
+#   warning "amqp_framing.h is deprecated, use rabbitmq-c/framing.h instead."
+#endif
 
 #include <rabbitmq-c/framing.h>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/include/amqp_ssl_socket.h 
new/rabbitmq-c-0.14.0/include/amqp_ssl_socket.h
--- old/rabbitmq-c-0.13.0/include/amqp_ssl_socket.h     2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/include/amqp_ssl_socket.h     2024-03-23 
20:23:35.000000000 +0100
@@ -6,7 +6,11 @@
 #ifndef AMQP_SSL_H
 #define AMQP_SSL_H
 
-#warning "amqp_ssl_socket.h is deprecated, use rabbitmq-c/ssl_socket.h instead.
+#ifdef _MSC_VER
+#   pragma message("warning: amqp_ssl_socket.h is deprecated, use 
rabbitmq-c/ssl_socket.h instead.")
+#else
+#   warning "amqp_ssl_socket.h is deprecated, use rabbitmq-c/ssl_socket.h 
instead."
+#endif
 
 #include <rabbitmq-c/ssl_socket.h>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/include/amqp_tcp_socket.h 
new/rabbitmq-c-0.14.0/include/amqp_tcp_socket.h
--- old/rabbitmq-c-0.13.0/include/amqp_tcp_socket.h     2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/include/amqp_tcp_socket.h     2024-03-23 
20:23:35.000000000 +0100
@@ -4,7 +4,11 @@
 #ifndef AMQP_TCP_SOCKET_H
 #define AMQP_TCP_SOCKET_H
 
-#warning "amqp_tcp_socket.h is deprecated, use rabbitmq-c/tcp_socket.h 
instead."
+#ifdef _MSC_VER
+#   pragma message("warning: amqp_tcp_socket.h is deprecated, use 
rabbitmq-c/tcp_socket.h instead.")
+#else
+#   warning "amqp_tcp_socket.h is deprecated, use rabbitmq-c/tcp_socket.h 
instead."
+#endif
 
 #include <rabbitmq-c/tcp_socket.h>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/include/rabbitmq-c/amqp.h 
new/rabbitmq-c-0.14.0/include/rabbitmq-c/amqp.h
--- old/rabbitmq-c-0.13.0/include/rabbitmq-c/amqp.h     2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/include/rabbitmq-c/amqp.h     2024-03-23 
20:23:35.000000000 +0100
@@ -118,7 +118,7 @@
  */
 
 #define AMQP_VERSION_MAJOR 0
-#define AMQP_VERSION_MINOR 13
+#define AMQP_VERSION_MINOR 14
 #define AMQP_VERSION_PATCH 0
 #define AMQP_VERSION_IS_RELEASE 1
 
@@ -670,7 +670,8 @@
                                                          certificate failed. */
   AMQP_STATUS_SSL_CONNECTION_FAILED = -0x0203, /**< SSL handshake failed. */
   AMQP_STATUS_SSL_SET_ENGINE_FAILED = -0x0204, /**< SSL setting engine failed 
*/
-  _AMQP_STATUS_SSL_NEXT_VALUE = -0x0205        /**< Internal value */
+  AMQP_STATUS_SSL_UNIMPLEMENTED = -0x0205, /**< SSL API is not implemented. */
+  _AMQP_STATUS_SSL_NEXT_VALUE = -0x0206        /**< Internal value */
 } amqp_status_enum;
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/include/rabbitmq-c/ssl_socket.h 
new/rabbitmq-c-0.14.0/include/rabbitmq-c/ssl_socket.h
--- old/rabbitmq-c-0.13.0/include/rabbitmq-c/ssl_socket.h       2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/include/rabbitmq-c/ssl_socket.h       2024-03-23 
20:23:35.000000000 +0100
@@ -50,6 +50,19 @@
 void *AMQP_CALL amqp_ssl_socket_get_context(amqp_socket_t *self);
 
 /**
+ * Enable loading of the CA certificates from the default location.
+ *
+ * \param [in,out] self An SSL/TLS socket object.
+ *
+ * \return \ref AMQP_STATUS_OK on success an \ref amqp_status_enum value on
+ *  failure.
+ *
+ * \since v0.14.0
+ */
+AMQP_EXPORT
+int AMQP_CALL amqp_ssl_socket_enable_default_verify_paths(amqp_socket_t *self);
+
+/**
  * Set the CA certificate.
  *
  * \param [in,out] self An SSL/TLS socket object.
@@ -102,7 +115,8 @@
  * \param [in] the key ID.
  *
  * \return \ref AMQP_STATUS_OK on success an \ref amqp_status_enum value on
- *  failure.
+ *  failure. May return \ref AMQP_STATUS_SSL_UNIMPLEMENTED if OpenSSL does 
+ *  not support the ENGINE API.
  *
  * \since v0.11.0
  */
@@ -189,6 +203,9 @@
  * connecting to the broker. Set min == max to restrict to just that
  * version.
  *
+ * As of v0.14.0 the defaults are TLS v1.2 and TLS v1.3. TLS v1.1 and lower are
+ * no longer supported.
+ *
  * \param [in,out] self An SSL/TLS socket object.
  * \param [in] min the minimum acceptable TLS version
  * \param [in] max the maxmium acceptable TLS version
@@ -262,7 +279,8 @@
  * has been called.
  *
  * \param [in] engine the engine ID
- * \return AMQP_STATUS_OK on success.
+ * \return AMQP_STATUS_OK on success. May return \ref 
AMQP_STATUS_SSL_UNIMPLEMENTED
+ *   if OpenSSL does not support the ENGINE API.
  *
  * \since v0.11.0
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/CMakeLists.txt 
new/rabbitmq-c-0.14.0/librabbitmq/CMakeLists.txt
--- old/rabbitmq-c-0.13.0/librabbitmq/CMakeLists.txt    2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/CMakeLists.txt    2024-03-23 
20:23:35.000000000 +0100
@@ -90,6 +90,13 @@
     SOVERSION ${RMQ_SOVERSION}
   )
 
+  if (APPLE)
+    set_target_properties(rabbitmq PROPERTIES
+      MACHO_CURRENT_VERSION 
${RMQ_SOVERSION}.${RMQ_SOVERSION_AGE}.${RMQ_SOVERSION_REVISION}
+      MACHO_COMPATIBILITY_VERSION ${RMQ_SOVERSION}
+    )
+  endif()
+
   if (WIN32)
     set_target_properties(rabbitmq PROPERTIES OUTPUT_NAME 
rabbitmq.${RMQ_SOVERSION})
   endif()
@@ -99,7 +106,7 @@
             COMPONENT rabbitmq-c-runtime
     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
             COMPONENT rabbitmq-c-runtime
-            NAMELINK_COMPONENT runtime-c-development
+            NAMELINK_COMPONENT rabbitmq-c-development
     ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
             COMPONENT rabbitmq-c-development
   )
@@ -129,7 +136,15 @@
 
   set_target_properties(rabbitmq-static PROPERTIES
     VERSION ${RMQ_VERSION}
-    SOVERSION ${RMQ_SOVERSION})
+    SOVERSION ${RMQ_SOVERSION}
+  )
+
+  if (APPLE)
+    set_target_properties(rabbitmq-static PROPERTIES
+      MACHO_CURRENT_VERSION 
${RMQ_SOVERSION}.${RMQ_SOVERSION_AGE}.${RMQ_SOVERSION_REVISION}
+      MACHO_COMPATIBILITY_VERSION ${RMQ_SOVERSION}
+    )
+  endif()
 
   if (WIN32)
     set_target_properties(rabbitmq-static PROPERTIES OUTPUT_NAME 
librabbitmq.${RMQ_SOVERSION})
@@ -137,11 +152,6 @@
     set_target_properties(rabbitmq-static PROPERTIES OUTPUT_NAME rabbitmq)
   endif()
 
-  if(MSVC)
-    # Embed debugging info in the library itself instead of generating a .pdb 
file.
-    set_target_properties(rabbitmq-static PROPERTIES COMPILE_OPTIONS "/Z7")
-  endif()
-
   if(INSTALL_STATIC_LIBS)
     install(TARGETS rabbitmq-static EXPORT "${targets_export_name}"
       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/amqp_api.c 
new/rabbitmq-c-0.14.0/librabbitmq/amqp_api.c
--- old/rabbitmq-c-0.13.0/librabbitmq/amqp_api.c        2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/amqp_api.c        2024-03-23 
20:23:35.000000000 +0100
@@ -85,7 +85,9 @@
     /* AMQP_STATUS_SSL_CONNECTION_FAILED      -0x0203 */
     "SSL handshake failed",
     /* AMQP_STATUS_SSL_SET_ENGINE_FAILED      -0x0204 */
-    "SSL setting engine failed"};
+    "SSL setting engine failed",
+    /* AMQP_STATUS_SSL_UNIMPLEMENTED          -0x0204 */
+    "SSL API is not implemented"};
 
 static const char *unknown_error_string = "(unknown error)";
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/amqp_openssl.c 
new/rabbitmq-c-0.14.0/librabbitmq/amqp_openssl.c
--- old/rabbitmq-c-0.13.0/librabbitmq/amqp_openssl.c    2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/amqp_openssl.c    2024-03-23 
20:23:35.000000000 +0100
@@ -9,8 +9,8 @@
 #define _CRT_SECURE_NO_WARNINGS
 #endif
 
-// Use OpenSSL v1.1.0 API.
-#define OPENSSL_API_COMPAT 10100
+// Use OpenSSL v1.1.1 API.
+#define OPENSSL_API_COMPAT 10101
 
 #include "amqp_openssl_bio.h"
 #include "amqp_private.h"
@@ -23,8 +23,11 @@
 #include <limits.h>
 #include <openssl/bio.h>
 #include <openssl/conf.h>
+#ifdef ENABLE_SSL_ENGINE_API
 #include <openssl/engine.h>
+#endif
 #include <openssl/err.h>
+#include <openssl/rsa.h>
 #include <openssl/ssl.h>
 #include <openssl/x509v3.h>
 #include <stdlib.h>
@@ -36,7 +39,9 @@
 static pthread_mutex_t openssl_init_mutex = PTHREAD_MUTEX_INITIALIZER;
 static amqp_boolean_t openssl_bio_initialized = 0;
 static int openssl_connections = 0;
+#ifdef ENABLE_SSL_ENGINE_API
 static ENGINE *openssl_engine = NULL;
+#endif
 
 #define CHECK_SUCCESS(condition)                                            \
   do {                                                                      \
@@ -233,7 +238,7 @@
       goto error_out3;
     }
 
-    if (1 != X509_check_host(cert, host, 0,
+    if (1 != X509_check_host(cert, host, strlen(host),
                              X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS, NULL)) {
       self->internal_error = 0;
       status = AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED;
@@ -327,14 +332,15 @@
     goto error;
   }
 
-  self->ctx = SSL_CTX_new(SSLv23_client_method());
+  self->ctx = SSL_CTX_new(TLS_client_method());
   if (!self->ctx) {
     goto error;
   }
-  /* Disable SSLv2 and SSLv3 */
-  SSL_CTX_set_options(self->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
-  amqp_ssl_socket_set_ssl_versions((amqp_socket_t *)self, AMQP_TLSv1_2,
-                                   AMQP_TLSvLATEST);
+  status = amqp_ssl_socket_set_ssl_versions((amqp_socket_t *)self, 
AMQP_TLSv1_2,
+                                            AMQP_TLSvLATEST);
+  if (status != AMQP_STATUS_OK) {
+    goto error;
+  }
 
   SSL_CTX_set_mode(self->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
   /* OpenSSL v1.1.1 turns this on by default, which makes the non-blocking
@@ -356,6 +362,20 @@
   return ((struct amqp_ssl_socket_t *)base)->ctx;
 }
 
+int amqp_ssl_socket_enable_default_verify_paths(amqp_socket_t *base) {
+  int status;
+  struct amqp_ssl_socket_t *self;
+  if (base->klass != &amqp_ssl_socket_class) {
+    amqp_abort("<%p> is not of type amqp_ssl_socket_t", base);
+  }
+  self = (struct amqp_ssl_socket_t *)base;
+  status = SSL_CTX_set_default_verify_paths(self->ctx);
+  if (1 != status) {
+    return AMQP_STATUS_SSL_ERROR;
+  }
+  return AMQP_STATUS_OK;
+}
+
 int amqp_ssl_socket_set_cacert(amqp_socket_t *base, const char *cacert) {
   int status;
   struct amqp_ssl_socket_t *self;
@@ -391,6 +411,7 @@
 
 int amqp_ssl_socket_set_key_engine(amqp_socket_t *base, const char *cert,
                                    const char *key) {
+#ifdef ENABLE_SSL_ENGINE_API
   int status;
   struct amqp_ssl_socket_t *self;
   EVP_PKEY *pkey = NULL;
@@ -415,6 +436,9 @@
     return AMQP_STATUS_SSL_ERROR;
   }
   return AMQP_STATUS_OK;
+#else
+  return AMQP_STATUS_SSL_UNIMPLEMENTED;
+#endif
 }
 
 static int password_cb(AMQP_UNUSED char *buffer, AMQP_UNUSED int length,
@@ -509,64 +533,52 @@
   self->verify_hostname = verify;
 }
 
+static int get_tls_version(amqp_tls_version_t ver, int *tls_version) {
+  switch (ver) {
+    case AMQP_TLSv1_2:
+      *tls_version = TLS1_2_VERSION;
+      break;
+    case AMQP_TLSv1_3:
+    case AMQP_TLSvLATEST:
+      *tls_version = TLS1_3_VERSION;
+      break;
+    default:
+      return AMQP_STATUS_UNSUPPORTED;
+  }
+  return AMQP_STATUS_OK;
+}
+
 int amqp_ssl_socket_set_ssl_versions(amqp_socket_t *base,
                                      amqp_tls_version_t min,
                                      amqp_tls_version_t max) {
   struct amqp_ssl_socket_t *self;
+  int min_ver;
+  int max_ver;
+  int status;
   if (base->klass != &amqp_ssl_socket_class) {
     amqp_abort("<%p> is not of type amqp_ssl_socket_t", base);
   }
   self = (struct amqp_ssl_socket_t *)base;
 
-  {
-    long clear_options;
-    long set_options = 0;
-#if defined(SSL_OP_NO_TLSv1_3)
-    amqp_tls_version_t max_supported = AMQP_TLSv1_3;
-    clear_options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2 |
-                    SSL_OP_NO_TLSv1_3;
-#elif defined(SSL_OP_NO_TLSv1_2)
-    amqp_tls_version_t max_supported = AMQP_TLSv1_2;
-    clear_options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;
-#else
-#error "Need a version of OpenSSL that can support TLSv1.2 or greater."
-#endif
-
-    if (AMQP_TLSvLATEST == max) {
-      max = max_supported;
-    }
-    if (AMQP_TLSvLATEST == min) {
-      min = max_supported;
-    }
+  if (max < min) {
+    return AMQP_STATUS_INVALID_PARAMETER;
+  }
 
-    if (min > max) {
-      return AMQP_STATUS_INVALID_PARAMETER;
-    }
+  status = get_tls_version(min, &min_ver);
+  if (status != AMQP_STATUS_OK) {
+    return status;
+  }
 
-    if (max > max_supported || min > max_supported) {
-      return AMQP_STATUS_UNSUPPORTED;
-    }
+  status = get_tls_version(max, &max_ver);
+  if (status != AMQP_STATUS_OK) {
+    return status;
+  }
 
-    if (min > AMQP_TLSv1) {
-      set_options |= SSL_OP_NO_TLSv1;
-    }
-#ifdef SSL_OP_NO_TLSv1_1
-    if (min > AMQP_TLSv1_1 || max < AMQP_TLSv1_1) {
-      set_options |= SSL_OP_NO_TLSv1_1;
-    }
-#endif
-#ifdef SSL_OP_NO_TLSv1_2
-    if (max < AMQP_TLSv1_2) {
-      set_options |= SSL_OP_NO_TLSv1_2;
-    }
-#endif
-#ifdef SSL_OP_NO_TLSv1_3
-    if (max < AMQP_TLSv1_3) {
-      set_options |= SSL_OP_NO_TLSv1_3;
-    }
-#endif
-    SSL_CTX_clear_options(self->ctx, clear_options);
-    SSL_CTX_set_options(self->ctx, set_options);
+  if (!SSL_CTX_set_min_proto_version(self->ctx, min_ver)) {
+    return AMQP_STATUS_INVALID_PARAMETER;
+  }
+  if (!SSL_CTX_set_max_proto_version(self->ctx, max_ver)) {
+    return AMQP_STATUS_INVALID_PARAMETER;
   }
 
   return AMQP_STATUS_OK;
@@ -580,6 +592,7 @@
 int amqp_initialize_ssl_library(void) { return AMQP_STATUS_OK; }
 
 int amqp_set_ssl_engine(const char *engine) {
+#ifdef ENABLE_SSL_ENGINE_API
   int status = AMQP_STATUS_OK;
   CHECK_SUCCESS(pthread_mutex_lock(&openssl_init_mutex));
 
@@ -609,6 +622,9 @@
 out:
   CHECK_SUCCESS(pthread_mutex_unlock(&openssl_init_mutex));
   return status;
+#else
+  return AMQP_STATUS_SSL_UNIMPLEMENTED;
+#endif
 }
 
 static int initialize_ssl_and_increment_connections() {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/amqp_openssl_bio.c 
new/rabbitmq-c-0.14.0/librabbitmq/amqp_openssl_bio.c
--- old/rabbitmq-c-0.13.0/librabbitmq/amqp_openssl_bio.c        2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/amqp_openssl_bio.c        2024-03-23 
20:23:35.000000000 +0100
@@ -108,7 +108,15 @@
   if (!(amqp_bio_method = BIO_meth_new(BIO_TYPE_SOCKET, "amqp_bio_method"))) {
     return AMQP_STATUS_NO_MEMORY;
   }
-
+#ifdef OPENSSL_IS_BORINGSSL
+  BIO_meth_set_create(amqp_bio_method, BIO_s_socket()->create);
+  BIO_meth_set_destroy(amqp_bio_method, BIO_s_socket()->destroy);
+  BIO_meth_set_ctrl(amqp_bio_method, BIO_s_socket()->ctrl);
+  BIO_meth_set_read(amqp_bio_method, BIO_s_socket()->bread);
+  BIO_meth_set_write(amqp_bio_method, BIO_s_socket()->bwrite);
+  BIO_meth_set_gets(amqp_bio_method, BIO_s_socket()->bgets);
+  BIO_meth_set_puts(amqp_bio_method, BIO_s_socket()->bputs);
+#else
   BIO_meth_set_create(amqp_bio_method, BIO_meth_get_create(BIO_s_socket()));
   BIO_meth_set_destroy(amqp_bio_method, BIO_meth_get_destroy(BIO_s_socket()));
   BIO_meth_set_ctrl(amqp_bio_method, BIO_meth_get_ctrl(BIO_s_socket()));
@@ -118,6 +126,7 @@
   BIO_meth_set_write(amqp_bio_method, BIO_meth_get_write(BIO_s_socket()));
   BIO_meth_set_gets(amqp_bio_method, BIO_meth_get_gets(BIO_s_socket()));
   BIO_meth_set_puts(amqp_bio_method, BIO_meth_get_puts(BIO_s_socket()));
+#endif
 
   BIO_meth_set_write(amqp_bio_method, amqp_openssl_bio_write);
   BIO_meth_set_read(amqp_bio_method, amqp_openssl_bio_read);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/amqp_openssl_bio.h 
new/rabbitmq-c-0.14.0/librabbitmq/amqp_openssl_bio.h
--- old/rabbitmq-c-0.13.0/librabbitmq/amqp_openssl_bio.h        2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/amqp_openssl_bio.h        2024-03-23 
20:23:35.000000000 +0100
@@ -4,8 +4,8 @@
 #ifndef AMQP_OPENSSL_BIO
 #define AMQP_OPENSSL_BIO
 
-// Use OpenSSL v1.1.0 API.
-#define OPENSSL_API_COMPAT 10100
+// Use OpenSSL v1.1.1 API.
+#define OPENSSL_API_COMPAT 10101
 
 #include <openssl/bio.h>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/amqp_socket.c 
new/rabbitmq-c-0.14.0/librabbitmq/amqp_socket.c
--- old/rabbitmq-c-0.13.0/librabbitmq/amqp_socket.c     2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/amqp_socket.c     2024-03-23 
20:23:35.000000000 +0100
@@ -729,7 +729,7 @@
       state->last_queued_frame = link;
     }
   }
-  res = amqp_time_s_from_now(&timeout, 0);
+  res = amqp_time_from_now(&timeout, &(struct timeval){0});
   if (AMQP_STATUS_OK != res) {
     return res;
   }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/librabbitmq/amqp_table.c 
new/rabbitmq-c-0.14.0/librabbitmq/amqp_table.c
--- old/rabbitmq-c-0.13.0/librabbitmq/amqp_table.c      2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/librabbitmq/amqp_table.c      2024-03-23 
20:23:35.000000000 +0100
@@ -15,9 +15,11 @@
 
 #define INITIAL_ARRAY_SIZE 16
 #define INITIAL_TABLE_SIZE 16
+#define TABLE_DEPTH_LIMIT 100
 
 static int amqp_decode_field_value(amqp_bytes_t encoded, amqp_pool_t *pool,
-                                   amqp_field_value_t *entry, size_t *offset);
+                                   amqp_field_value_t *entry, size_t *offset,
+                                   int depth);
 
 static int amqp_encode_field_value(amqp_bytes_t encoded,
                                    amqp_field_value_t *entry, size_t *offset);
@@ -25,7 +27,7 @@
 /*---------------------------------------------------------------------------*/
 
 static int amqp_decode_array(amqp_bytes_t encoded, amqp_pool_t *pool,
-                             amqp_array_t *output, size_t *offset) {
+                             amqp_array_t *output, size_t *offset, int depth) {
   uint32_t arraysize;
   int num_entries = 0;
   int allocated_entries = INITIAL_ARRAY_SIZE;
@@ -61,7 +63,8 @@
       entries = newentries;
     }
 
-    res = amqp_decode_field_value(encoded, pool, &entries[num_entries], 
offset);
+    res = amqp_decode_field_value(encoded, pool, &entries[num_entries], offset,
+                                  depth);
     if (res < 0) {
       goto out;
     }
@@ -90,8 +93,9 @@
   return res;
 }
 
-int amqp_decode_table(amqp_bytes_t encoded, amqp_pool_t *pool,
-                      amqp_table_t *output, size_t *offset) {
+static int amqp_decode_table_internal(amqp_bytes_t encoded, amqp_pool_t *pool,
+                                      amqp_table_t *output, size_t *offset,
+                                      int depth) {
   uint32_t tablesize;
   int num_entries = 0;
   amqp_table_entry_t *entries;
@@ -141,7 +145,7 @@
     }
 
     res = amqp_decode_field_value(encoded, pool, &entries[num_entries].value,
-                                  offset);
+                                  offset, depth);
     if (res < 0) {
       goto out;
     }
@@ -170,10 +174,20 @@
   return res;
 }
 
+int amqp_decode_table(amqp_bytes_t encoded, amqp_pool_t *pool,
+                      amqp_table_t *output, size_t *offset) {
+  return amqp_decode_table_internal(encoded, pool, output, offset, 0);
+}
+
 static int amqp_decode_field_value(amqp_bytes_t encoded, amqp_pool_t *pool,
-                                   amqp_field_value_t *entry, size_t *offset) {
+                                   amqp_field_value_t *entry, size_t *offset,
+                                   int depth) {
   int res = AMQP_STATUS_BAD_AMQP_DATA;
 
+  if (depth > TABLE_DEPTH_LIMIT) {
+    return AMQP_STATUS_BAD_AMQP_DATA;
+  }
+
   if (!amqp_decode_8(encoded, offset, &entry->kind)) {
     goto out;
   }
@@ -242,14 +256,16 @@
     }
 
     case AMQP_FIELD_KIND_ARRAY:
-      res = amqp_decode_array(encoded, pool, &(entry->value.array), offset);
+      res = amqp_decode_array(encoded, pool, &(entry->value.array), offset,
+                              depth + 1);
       goto out;
 
     case AMQP_FIELD_KIND_TIMESTAMP:
       TRIVIAL_FIELD_DECODER(64);
 
     case AMQP_FIELD_KIND_TABLE:
-      res = amqp_decode_table(encoded, pool, &(entry->value.table), offset);
+      res = amqp_decode_table_internal(encoded, pool, &(entry->value.table),
+                                       offset, depth + 1);
       goto out;
 
     case AMQP_FIELD_KIND_VOID:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/tools/common.c 
new/rabbitmq-c-0.14.0/tools/common.c
--- old/rabbitmq-c-0.13.0/tools/common.c        2023-02-06 01:31:11.000000000 
+0100
+++ new/rabbitmq-c-0.14.0/tools/common.c        2024-03-23 20:23:35.000000000 
+0100
@@ -18,6 +18,11 @@
 #include "compat.h"
 #endif
 
+/* For when reading auth data from a file */
+#define MAXAUTHTOKENLEN 128
+#define USERNAMEPREFIX "username:"
+#define PASSWORDPREFIX "password:"
+
 void die(const char *fmt, ...) {
   va_list ap;
   va_start(ap, fmt);
@@ -125,6 +130,7 @@
 static char *amqp_username;
 static char *amqp_password;
 static int amqp_heartbeat = 0;
+static char *amqp_authfile;
 #ifdef WITH_SSL
 static int amqp_ssl = 0;
 static char *amqp_cacert = "/etc/ssl/certs/cacert.pem";
@@ -147,6 +153,8 @@
      "the password to login with", "password"},
     {"heartbeat", 0, POPT_ARG_INT, &amqp_heartbeat, 0,
      "heartbeat interval, set to 0 to disable", "heartbeat"},
+    {"authfile", 0, POPT_ARG_STRING, &amqp_authfile, 0,
+     "path to file containing username/password for authentication", "file"},
 #ifdef WITH_SSL
     {"ssl", 0, POPT_ARG_NONE, &amqp_ssl, 0, "connect over SSL/TLS", NULL},
     {"cacert", 0, POPT_ARG_STRING, &amqp_cacert, 0,
@@ -158,6 +166,50 @@
 #endif /* WITH_SSL */
     {NULL, '\0', 0, NULL, 0, NULL, NULL}};
 
+void read_authfile(const char *path) {
+  size_t n;
+  FILE *fp = NULL;
+  char token[MAXAUTHTOKENLEN];
+
+  if ((amqp_username = malloc(MAXAUTHTOKENLEN)) == NULL ||
+      (amqp_password = malloc(MAXAUTHTOKENLEN)) == NULL) {
+    die("Out of memory");
+  } else if ((fp = fopen(path, "r")) == NULL) {
+    die("Could not read auth data file %s", path);
+  }
+
+  if (fgets(token, MAXAUTHTOKENLEN, fp) == NULL ||
+      strncmp(token, USERNAMEPREFIX, strlen(USERNAMEPREFIX))) {
+    die("Malformed auth file (missing username)");
+  }
+  strncpy(amqp_username, &token[strlen(USERNAMEPREFIX)], MAXAUTHTOKENLEN);
+  /* Missing newline means token was cut off */
+  n = strlen(amqp_username);
+  if (amqp_username[n - 1] != '\n') {
+    die("Username too long");
+  } else {
+    amqp_username[n - 1] = '\0';
+  }
+
+  if (fgets(token, MAXAUTHTOKENLEN, fp) == NULL ||
+      strncmp(token, PASSWORDPREFIX, strlen(PASSWORDPREFIX))) {
+    die("Malformed auth file (missing password)");
+  }
+  strncpy(amqp_password, &token[strlen(PASSWORDPREFIX)], MAXAUTHTOKENLEN);
+  /* Missing newline means token was cut off */
+  n = strlen(amqp_password);
+  if (amqp_password[n - 1] != '\n') {
+    die("Password too long");
+  } else {
+    amqp_password[n - 1] = '\0';
+  }
+
+  (void)fgetc(fp);
+  if (!feof(fp)) {
+    die("Malformed auth file (trailing data)");
+  }
+}
+
 static void init_connection_info(struct amqp_connection_info *ci) {
   ci->user = NULL;
   ci->password = NULL;
@@ -237,6 +289,8 @@
   if (amqp_username) {
     if (amqp_url) {
       die("--username and --url options cannot be used at the same time");
+    } else if (amqp_authfile) {
+      die("--username and --authfile options cannot be used at the same time");
     }
 
     ci->user = amqp_username;
@@ -245,11 +299,23 @@
   if (amqp_password) {
     if (amqp_url) {
       die("--password and --url options cannot be used at the same time");
+    } else if (amqp_authfile) {
+      die("--password and --authfile options cannot be used at the same time");
     }
 
     ci->password = amqp_password;
   }
 
+  if (amqp_authfile) {
+    if (amqp_url) {
+      die("--authfile and --url options cannot be used at the same time");
+    }
+
+    read_authfile(amqp_authfile);
+    ci->user = amqp_username;
+    ci->password = amqp_password;
+  }
+
   if (amqp_vhost) {
     if (amqp_url) {
       die("--vhost and --url options cannot be used at the same time");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/rabbitmq-c-0.13.0/tools/doc/amqp-consume.xml 
new/rabbitmq-c-0.14.0/tools/doc/amqp-consume.xml
--- old/rabbitmq-c-0.13.0/tools/doc/amqp-consume.xml    2023-02-06 
01:31:11.000000000 +0100
+++ new/rabbitmq-c-0.14.0/tools/doc/amqp-consume.xml    2024-03-23 
20:23:35.000000000 +0100
@@ -194,7 +194,7 @@
                 output the message bodies on standard output via
                 <command>cat</command>:</term>
                 <listitem>
-                    <screen><prompt>$ </prompt><userinput>amqp-publish -q 
myqueue cat</userinput></screen>
+                    <screen><prompt>$ </prompt><userinput>amqp-consume -q 
myqueue cat</userinput></screen>
                 </listitem>
             </varlistentry>
 

Reply via email to