From bc6ad2b8f9ddc5d851b9e8a7dd85291b676c415f Mon Sep 17 00:00:00 2001 From: Bradley White <14679271+devbww@users.noreply.github.com> Date: Mon, 11 Jul 2022 17:40:32 -0400 Subject: [PATCH] fix(spanner): avoid evaluation-order issue in function arguments The behavior of ``` extern void f(std::unique_ptr, T); std::unique_ptr p = ...; f(std::move(p), *p); ``` is undefined, so introduce a sequence point between dereferencing the `unique_ptr` and moving it. --- google/cloud/spanner/internal/connection_impl.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/google/cloud/spanner/internal/connection_impl.cc b/google/cloud/spanner/internal/connection_impl.cc index 8f4517e06315f..d5bf518263421 100644 --- a/google/cloud/spanner/internal/connection_impl.cc +++ b/google/cloud/spanner/internal/connection_impl.cc @@ -469,9 +469,10 @@ spanner::RowStream ConnectionImpl::ReadImpl( tracing_options](std::string const& resume_token) mutable { if (!resume_token.empty()) request->set_resume_token(resume_token); auto context = absl::make_unique(); + auto grpc_reader = stub->StreamingRead(*context, *request); std::unique_ptr reader = absl::make_unique( - std::move(context), stub->StreamingRead(*context, *request)); + std::move(context), std::move(grpc_reader)); if (tracing_enabled) { reader = absl::make_unique(std::move(reader), tracing_options); @@ -688,9 +689,10 @@ ResultType ConnectionImpl::CommonQueryImpl( tracing_options](std::string const& resume_token) mutable { if (!resume_token.empty()) request.set_resume_token(resume_token); auto context = absl::make_unique(); + auto grpc_reader = stub->ExecuteStreamingSql(*context, request); std::unique_ptr reader = absl::make_unique( - std::move(context), stub->ExecuteStreamingSql(*context, request)); + std::move(context), std::move(grpc_reader)); if (tracing_enabled) { reader = absl::make_unique(std::move(reader), tracing_options);