diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 2b703a3e1ca3..807387fa8305 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -3715,6 +3715,25 @@ function(build_google_cloud_cpp_storage) ${CMAKE_CURRENT_LIST_DIR}/google-cloud-cpp-reproducible-builds.patch) endif() + # google-cloud-cpp, which depends on OpenSSL, + # does not yet support OpenSSL 4.x. + # + # TODO: Once google-cloud-cpp supports OpenSSL 4.x, + # remove this workaround and google-cloud-cpp-openssl4-compatibility.patch. + # https://github.com/googleapis/google-cloud-cpp/issues/16510 + if(PATCH) + if(GOOGLE_CLOUD_CPP_PATCH_COMMAND) + list(APPEND GOOGLE_CLOUD_CPP_PATCH_COMMAND COMMAND) + endif() + + list(APPEND + GOOGLE_CLOUD_CPP_PATCH_COMMAND + ${PATCH} + -p1 + -i + ${CMAKE_CURRENT_LIST_DIR}/google-cloud-cpp-openssl4-compatibility.patch) + endif() + fetchcontent_declare(google_cloud_cpp ${FC_DECLARE_COMMON_OPTIONS} PATCH_COMMAND ${GOOGLE_CLOUD_CPP_PATCH_COMMAND} diff --git a/cpp/cmake_modules/google-cloud-cpp-openssl4-compatibility.patch b/cpp/cmake_modules/google-cloud-cpp-openssl4-compatibility.patch new file mode 100644 index 000000000000..8a4dfae3a7b3 --- /dev/null +++ b/cpp/cmake_modules/google-cloud-cpp-openssl4-compatibility.patch @@ -0,0 +1,30 @@ +# 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. + +diff --git a/google/cloud/internal/openssl/parse_service_account_p12_file.cc b/google/cloud/internal/openssl/parse_service_account_p12_file.cc +index bb0462dcf0..9dfb59750b 100644 +--- a/google/cloud/internal/openssl/parse_service_account_p12_file.cc ++++ b/google/cloud/internal/openssl/parse_service_account_p12_file.cc +@@ -85,7 +85,7 @@ StatusOr ParseServiceAccountP12File( + } + + // This is automatically deleted by `cert`. +- X509_NAME* name = X509_get_subject_name(cert.get()); ++ auto* name = X509_get_subject_name(cert.get()); + + std::string service_account_id = [&name]() -> std::string { + auto openssl_free = [](void* addr) { OPENSSL_free(addr); };